【发布时间】:2017-08-24 23:30:02
【问题描述】:
我正在查看一些描述互斥量和二进制信号量之间区别的主题。在许多主题中,都指出信号量充当信号量机制,即如果一个线程锁定了一个信号量,那么另一个线程可以解锁(释放)信号量(充当信号)。 但是在互斥锁的情况下,只有锁定互斥锁的线程才能解锁它。它不能被任何其他线程解锁,如果其他线程试图解锁它,这将返回错误。
我尝试编写使用互斥锁进行同步的代码。在代码中,我将互斥锁锁定在一个线程中,并成功解锁了另一个线程中的互斥锁。 有人可以解释这是怎么发生的吗?根据其他线程应该无法解锁互斥锁的答案。
欢迎提出任何建议。
【问题讨论】:
-
您似乎对互斥体语义有错误的理解;如果您在将互斥锁锁定在 same 线程中之前解锁了互斥锁,那么您的代码就是完全错误的。
-
感谢 FooF 纠正我。实际上,在将互斥锁锁定在同一个线程之前,我并没有解锁它。但是在一个线程中我锁定了它,而在另一个线程中我正在解锁它。
-
互斥锁的语义是你锁定它,然后用互斥锁保护的资源做你的事情,然后解锁互斥锁。 (始终保持互斥锁的锁定时间最短——除非您使用几乎不应该使用的递归互斥锁。)
-
如果您想在线程之间发出信号,您通常使用与互斥锁关联的条件变量。网上有很多例子,或者获取 Butenhof 关于 Pthreads 的优秀书籍。
-
for unlock() ... "互斥锁必须被当前执行线程锁定,否则,行为未定义。"这意味着任何事情都可能发生,包括它甚至可能看起来正在运行。另请注意,我从 mutex::unlock() 内部看到了一些类似断言的报告,但并不像我预期的那样频繁。
标签: linux synchronization pthreads mutex semaphore