默认情况下,CRITICAL_SECTION 对象是递归的。可以像 pthread 互斥体一样配置此行为以启用或禁用递归线程访问吗?
针对评论澄清一下:我特指的是 Windows CRITICAL_SECTION 对象,而不是 Windows 互斥体。
不,不能。记录的 API 没有以任何方式提及这一点。 Windows 临界区始终接受递归访问。
当线程拥有临界区时,它可以对 EnterCriticalSection 或 TryEnterCriticalSection 进行额外调用,而不会阻止其执行。这可以防止线程在等待它已经拥有的临界区时发生死锁。
来源:https://learn.microsoft.com/en-us/windows/win32/sync/ritic-section-objects
关键部分始终允许线程内递归。互斥体也是如此。这是设计使然,无法更改。
另一方面,信号量可以防止线程内的递归。有关更多详细信息,请参阅 MSDN 文档。