Sha*_*dor 3 c++ multithreading nonatomic
我已经阅读了一些类似的问题,但那里描述的情况有点复杂.
我在堆中有一个bool b初始化false和两个线程.我确实理解操作bools是not atomic,但请直到最后阅读问题.
第一个线程只能设置b = true一次,不会对它做任何其他事情.第二个线程检查b一个循环,如果它true做了一些动作.
我是否需要使用某些同步机制(如互斥锁)来保护b?如果我不这样做会怎么样?随着ints我能明显得到任意值,当我读到,并在同一时间写.但是,bools只有true而且false我不介意一次得到false而不是true.这是一种潜力SIGSEGV吗?
数据争用导致未定义的行为.就标准而言,允许符合条件的实现是段错误的.
在实践中,主要的危险是如果没有同步,编译器将在读取器循环中观察足够的代码以判断b"永不改变",并优化除了第一次读取值之外的所有代码.它可以这样做,因为如果它观察到循环中没有同步,那么它知道对值的任何写入都是数据争用.允许优化器假设您的程序不会引发未定义的行为,因此允许假设没有来自其他线程的写入.
标记b为volatile将在实践中阻止此特定优化,但即使volatile对象数据竞争也是未定义的行为.调用优化程序"无法看到"的代码也会阻止实际优化,因为它不知道代码是否会修改b.当然,对于链接时/整个程序优化,优化器看不到的内容少于仅编译时优化.
无论如何,防止在软件中进行优化并不能防止在具有非连贯缓存的系统上硬件中发生的同等事情(至少,我声称:其他人认为这是不正确的,并且volatile访问是必需的通过缓存读/写.有些实现的行为就是这样.如果你问的是标准是什么意思,那么硬件是否无限期地向你显示陈旧的缓存并不重要,因为行为仍然是未定义的,所以无论这个特定的优化是什么,实现都会破坏你的代码打破它.
| 归档时间: |
|
| 查看次数: |
360 次 |
| 最近记录: |