如何在C ++或Winapi中转移同步对象的所有权?

时间:2015-11-10 10:25:59

标签: c++ multithreading winapi mutex critical-section

是否可以将互斥锁,关键部分等的所有权从第一个线程转移到第二个线程,而不让任何第三个线程同时获取所有权? documentation for critical section禁止在调用EnterCriticalSection的线程之外的线程中调用LeaveCriticalSection:

  

如果一个线程在没有指定的临界区对象的所有权时调用LeaveCriticalSection,则会发生错误,导致另一个使用EnterCriticalSection的线程无限期地等待。

但在我的场景中,我需要在与获取它的人不同的线程中准确释放同步对象,这样其他(第三个)线程就不能同时获得同步对象的所有权(从此刻开始)第一个线程的获取直到第二个线程释放的时刻)。 C ++线程或WinAPI调用的解决方案适合我的需要。

1 个答案:

答案 0 :(得分:0)

不,不支持线程所有权转移。此外,我坚信任何依赖锁具所有权的设计都是有缺陷的,并且会引起麻烦。

但是,如果只需要从与接收线程不同的线程释放锁定所需的所有权转移,您有两种选择:

  • 使用信号量。按照设计,允许从任何线程中释放它们
  • 在未定义的行为中加入,并从不拥有它的线程中释放互斥锁。你需要了解这种后果。

未定义的行为

从未拥有它的线程中释放互斥锁是未定义的。但是,可以使用这些编写应用程序代码。您将遇到的问题是,如果锁定互斥锁的线程在一个CPU上运行,并且在另一个CPU上发生解锁,则非缓存一致性芯片上可能不会发生数据同步。结果,未受另一个同步保护的数据将是“脏”的。但是,如果没有这样的数据 - 例如,互斥体被用于'信号量'时代,并且不保护任何数据 - 这可能是可以接受的。