我认为它是实现定义的。
互斥体是否足够取决于您是否将互斥体视为临界区的机制或更多。
如http://en.cppreference.com/w/cpp/thread/mutex/unlock中所述,
互斥锁必须由当前执行线程锁定,否则行为未定义。
这意味着线程只能解锁在 C++ 中被自己锁定/拥有的互斥锁。
但在其他编程语言中,您可能能够在进程之间共享互斥锁。
因此区分这两个概念可能只是性能考虑,复杂的所有权标识或进程间共享对于简单的应用程序是不值得的。
例如,您可以使用额外的互斥锁修复 @slowjelj 的情况(这可能是不正确的修复):
线程1:
lock(mutex0);
while(1) {
lock(mutex0); // Blocks waiting for notification from Thread2
... // do work after notification is received
unlock(mutex1); // Tells Thread2 we are done
}
线程2:
while(1) {
lock(mutex1); // lock the mutex so Thread1 will block again
... // do the work that precedes notification
unlock(mutex0); // unblocks Thread1
}
但是您的程序会抱怨您触发了编译器留下的断言(例如,Visual Studio 2015 中的“解锁无主互斥锁”)。