|
|
1
16
不-不稳定并不意味着同步。这只意味着每个访问都将返回最新的值(而不是在线程中本地缓存的副本)。 Post-increment is not an atomic operation, it is a memory access followed by a memory write. Interleaving two can mean that the value is actually incremented just once. |
|
|
2
4
不,您必须使用依赖于平台的原子访问。有几个图书馆对这些进行了抽象-- GLib 提供可移植的原子操作,如果需要,可以返回到互斥锁,我相信Boost还提供了可移植的原子。
recently learned
对于真正的原子访问,您需要一个完整的内存屏障,
|
|
|
3
3
在现代快速多核处理器上,由于缓存和写缓冲区的存在,原子指令的开销很大。
所以编译器不会因为添加了原子指令而发出原子指令。
我建议使用图书馆。最简单的方法是在您想要更新变量时获取一个锁。如果信号量适合您所做的工作,那么它可能更快。似乎 GLib |
|
|
4
3
Windows provides InterlockedIncrement (和) InterlockedDecrement 做你想做的事。 |
|
5
1
volatile只会阻止优化,但原子性需要更多。在x86中,指令必须以锁前缀为前缀,在MIPS中,RMW循环必须由ll/sc构造包围,… |
|
|
6
0
您的问题是C不能保证增量操作符的原子性,实际上,它们通常不是原子性的。你必须使用像 Windows API 编译器编译函数 GCC , MSVC 为此。 |
|
|
ron burgundy · 获取-释放语义是否跨线程传递?[副本] 1 年前 |
|
|
H3007 · 并发运行python子进程似乎不是并发的 2 年前 |
|
|
The Oddler · TVar会阻止读取直到更改吗? 2 年前 |
|
|
Wang Tuma · 使用信号量的c++并发问题:按顺序打印 2 年前 |
|
|
Marcel Batista · 在不同线程中更新密钥时的字典线程安全 2 年前 |
|
|
rico · 当volatile关键字真的是必要的? 2 年前 |