c++ - 棘手的 InterlockedDecrement 与 CriticalSection

标签 c++ winapi thread-safety

全局long count计数器。
线程 A 做

EnterCriticalSection(&crit);
// .... do something
count++;                       // (*1)
// .. do something else
LeaveCriticalSection(&crit);

线程 B 做

InterlockedDecrement(&count); // (*2) not under critical secion.

在 (*1) 处,我处于临界区。在 (*2),我不是。

如果没有 InterlockedIncrement(),(*1) 安全吗? (它是 protected 临界区)。
我需要 InterlockedIncrement() 在 (*1) 吗?
我觉得我可以赞成也可以反对。

最佳答案

您应该使用一种或另一种,而不是混合使用它们。

虽然 InterlockedDecrement 保证是原子的,但 operator++ 不是,尽管在这种情况下它可能取决于您的架构。在这种情况下,您实际上根本没有保护 count 变量。

鉴于您似乎想要执行简单的递增/递减操作,我建议您在这种情况下简单地删除关键部分并使用关联的 Interlocked* 函数。

关于c++ - 棘手的 InterlockedDecrement 与 CriticalSection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6930787/

相关文章:

c++ - 条件变量 - 等待/通知竞争条件

c++ - 使用后缀数组算法进行 Burrows Wheeler 变换

c++ - qmake在命令行中分配变量

c++ - 从 C 代码中调用 R 脚本

c++ - 文本编辑器中的行管理

c++ - CreateProcess 未处理的错误

c++ - 如何从服务获取用户桌面的路径?

c# - 这段代码是线程安全的吗?

ios - Swift 变量在内存中丢失但在调试中可见

c++ - std::vector Erase - 它会自动取消分配吗?