数据共享之共享数据带来的问题
来源:互联网 发布:翼支付能在淘宝上用吗 编辑:程序博客网 时间:2024/06/05 00:09
修改共享数据会给共享数据带来问题。如果共享的数据是只读的话,就不会带来问题。如果数据可以修改,有超过两个以上的线程修改数据就会带来问题。必须用一些方法来消除问题。
资源竞争(race condition)
资源竞争是指在多线程环境下,程序结果的输出依赖于相关线程的执行顺序。英文:A race condition is anything where the outcome depends on the relative ordering of execution of operations on two or more threads; the threads race to perform their respective operations.
有些情况下,资源竞争情况下所有结果都能接受。例如,向链表添加结点,哪个线程先添加都无所谓,结果都是把结点添加上去了。有时候资源竞争的结果不能接受。我们常常讲的资源竞争是指有问题的、结果不能接受的资源竞争。C++标准中定义的数据竞争(data race)是资源竞争的一种特例。
当一个操作要修改多个不相关数据时,常常发生资源竞争。因为修改多个数据操作需要多个CPU指令,在此期间,其他线程可能访问这些数据。资源竞争很难发现,因为在资源竞争情况下也会出现正确结果。
避免资源竞争
避免资源竞争常用的办法是把数据包装起来。当包装被拆掉时,只有当前正在修改数据的这个进程可以看到数据。在其他线程看来,要么修改还没开始,要么修改已经结束了。C++标准提供了这样的机制。
另一中办法是修改数据结构和变量,使得修改的指令是连续的、不可中断的。这叫做无锁编程(lock-free programing),比较难。如果你在这个层次编程(working at this level),内存模型细微的修改都可能会使变量值变复杂。
还有一种处理资源竞争的办法就是把更新数据的操作当做事物(transaction)。如果成功,都成功;如果失败则回滚,都失败。
在C++标准库中,保护共享数据的最基本的机制是互斥量(mutex)。
0 0
- 数据共享之共享数据带来的问题
- android共享数据之SharedPreferences-组建间的数据共享和应用间的数据共享
- 共享数据窗口问题
- SharedPreferences 数据共享问题
- mysql 数据共享问题
- 数据共享之ContentProvider
- 数据共享之properties
- 数据共享之死锁
- WatchKit 之 数据共享
- WIN7与WINXP数据共享的问题
- 数据共享之SharedPreference共享参数文件
- 数据共享的方法
- 共享数据的保护
- 隐性数据的共享
- SharedPreferences之不同应用的数据共享
- 数据共享
- 数据共享问题--还是MVC
- 父子进程数据共享问题
- PAT(A) 1008
- 子抓祝邹撰拽转锥缀捉啄淄酌渍赚拽邹柞
- 椎宗字棕自滓坠自柞做祖庄篆族兹妆谆最
- leetcode - Search a 2D Matrix
- Find your present!(杭电1563)
- 数据共享之共享数据带来的问题
- 紫桩遵装滓走子滋最椎嘴捉渍宗爪孜族装
- boost库property_tree示例
- 我对COM的理解
- LCA + 树状数组 + 树上RMQ
- BeanUtil的应用填充数据
- 我的COM和ATL的学习
- 注装砖桩揍妆住最姿自篆租坠桩奏咨庄踪
- 大学专业学习的目标与期望