• 数据共享之共享数据带来的问题


    改动共享数据会给共享数据带来问题。假设共享的数据是仅仅读的话,就不会带来问题。

    假设数据能够改动。有超过两个以上的线程改动数据就会带来问题。

    必须用一些方法来消除问题。


    资源竞争(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)。
  • 相关阅读:
    将自己的工作环境全面移植到C++最后一道工序:能用MFC制作简单的图形界面
    Finally, the working environment has been moved to C++
    统计方面的书籍【zz】
    zz sql 通配符以及转义字符用法
    转载学习并实现DES加密解密算法(三)
    【资源分享】2009版大陆汉语常用字.txt下载
    自己实现的C++Trim()
    nmake命令(windows下的makefile)
    c++对象内存模型【内存布局】
    UML类图关系(VPUML工具绘图)
  • 原文地址:https://www.cnblogs.com/cxchanpin/p/6785746.html
Copyright © 2020-2023  润新知