|
|
1
36
原子读数
CPU缓存
在Wintel上,线程同步功能会自动添加一个完整的内存屏障,或者您可以使用 InterlockedXxxx MSDN: Memory and Synchronization issues , MemoryBarrier 宏 [编辑]另请参阅drhirsch的评论。 |
|
|
2
18
你问了一个关于读取变量的问题,然后你谈到了更新变量,这意味着一个读-修改-写操作。 如果是原子操作 对于几乎所有架构,整数都是如此。
|
|
|
3
9
我建议不要依赖任何编译器或架构
在这种情况下。
|
|
|
4
5
除非读取变量是一个原子操作,在这种情况下只需要一条(汇编)指令,否则无法确保上述情况不会发生。 (变量可以写入内存,检索值需要多条指令) 共识是,您应该单独封装/锁定所有写入,而读取可以与(仅)其他读取同时执行 |
|
|
5
4
建筑。每种架构都有读与写并发会导致垃圾的情况。 然而,几乎每种架构都有例外。 或 当前的 即使另一个线程正在写入,也可以将值作为单个原子操作。所以对于整数,你是安全的 大多数 建筑。有些人也会将这种保证扩展到其他一些尺寸,但这显然取决于硬件。 对于非字长变量,读取和写入通常都是非原子的,必须通过其他方式同步。 |
|
|
6
3
您可以在不使用互斥体的情况下读写整数变量。这是因为整数是32位架构中的基类型,每次修改/读取值都是通过一次操作完成的。
|
|
|
7
2
虽然在没有同步的情况下在32位系统上读取int可能是安全的。我不会冒险。虽然多个并发读取不是问题,但我不喜欢写入和读取同时发生。
如果你有一个不错的线程库,比如boost.thread或zthread,那么你应该有读/写锁。这些将非常适合您的情况,因为它们允许多次读取,同时保护写入。 |
|
|
8
1
这可能发生在使用16位整数的8位系统上。 如果你想避免锁定,在适当的情况下,你可以多次读取,直到得到两个相等的连续值。例如,我使用这种方法在32位嵌入式目标上读取64位时钟,其中时钟滴答被实现为中断例程。在这种情况下,读取三次就足够了,因为时钟在读取例程运行的短时间内只能滴答一次。 |
|
|
9
1
一般来说,每条机器指令在执行时都会经过几个硬件阶段。由于大多数当前的CPU都是多核或超线程的,这意味着读取变量可能会启动它在指令管道中的移动,但它不会阻止另一个CPU核心或超线程并发执行到同一地址的存储指令。读取和存储这两条同时执行的指令可能会“交叉路径”,这意味着读取将在存储新值之前收到旧值。
|
|
10
0
对具有并发性的变量的读/写都必须受到关键部分(而不是互斥)的保护。除非你想浪费一整天的时间调试。 我认为,关键部分是特定于平台的。在Win32上,临界区非常高效:当没有发生联锁时,进入临界区几乎是免费的,不会影响整体性能。当发生联锁时,它仍然比互斥更有效,因为它在挂起线程之前实现了一系列检查。 |
|
|
11
-1
|
|
12
-3
在盲目使用volatile之前,先了解一下它的作用: http://msdn.microsoft.com/en-us/library/12a04hfd(VS.80).aspx |
|
|
ron burgundy · 获取-释放语义是否跨线程传递?[副本] 1 年前 |
|
|
H3007 · 并发运行python子进程似乎不是并发的 1 年前 |
|
|
The Oddler · TVar会阻止读取直到更改吗? 1 年前 |
|
|
Wang Tuma · 使用信号量的c++并发问题:按顺序打印 2 年前 |
|
|
Marcel Batista · 在不同线程中更新密钥时的字典线程安全 2 年前 |
|
|
rico · 当volatile关键字真的是必要的? 2 年前 |