【发布时间】:2021-06-06 01:46:44
【问题描述】:
在 Windows 上。我认为对于一个进程中的线程之间的同步,临界区对象比互斥锁更好。这是因为 CS 对象工作在用户模式,而互斥对象工作在内核模式。所以 CS 对象比互斥对象轻。
但我见过一个进程使用互斥体而不是 CS 的情况。互斥锁甚至没有使用超时。
所以,我真的很好奇,在什么情况下互斥体比进程中的 CS 更好?
【问题讨论】:
-
CS 是特定于操作系统的——所以如果你想编写 portable 代码,你不应该使用它。
-
@Aconcagua 如果你确实使用它,你应该以一种易于在其他平台上用其他东西替换它的方式使用它
-
您应该检查是否在 MS-Windows 上
std::mutex是使用临界区实现的。std::mutex不需要使用重量级的 MS-Windows 跨进程互斥锁来实现,因为标准 C++ 没有跨进程同步的概念。 -
删除 C++ 标签。
-
CS 因其重量轻且支持旋转而有用。 Mutex 可用于进程间同步、检测由于意外线程/进程终止或错误导致的死锁、支持 APC 和等待超时。根本无法观察到差异并不罕见,等待时间往往很长。 MSVC 中的 std::mutex 构建在并发运行时之上,它既不使用 CS 也不使用互斥锁。
标签: windows winapi mutex critical-section