pthread互斥锁解锁为什么同一个线程?

时间:2011-09-16 01:08:48

标签: c linux pthreads mutex

可能是个基本问题?

1)为什么互斥锁应该在同一个线程上解锁?我们有什么具体的理由吗? 2)如果我理解正确的话,为什么在sem_wait / sem_post实现同样的情况下保持pthraed_mutex_lock?

3 个答案:

答案 0 :(得分:1)

在最常见的情况下,互斥锁设计为极其快速和轻便。最常见的情况是线程进入临界区,对共享状态进行一些快速更改,然后退出临界区。如果您有更复杂的要求,请使用更复​​杂的同步对象。但通常情况下,pthread互斥体将比几乎任何其他同步原语更轻。

答案 1 :(得分:1)

虽然它们有时可以互换使用,但互斥量和信号量具有非常不同的概念基础。他们的实际行为的不同程度取决于您的具体应用。

互斥锁在概念上有一个所有者 - 一个线程,根据约定/契约,程序员将其视为唯一允许访问互斥锁保护的资源的线程。根据互斥体的类型和实现,所有者可以纯粹是正式构造,也可以是存储在互斥对象中的实际字段。例如,对于递归或错误检查互斥锁,存储所有者允许拥有互斥锁的线程获取其上的附加引用计数,或者如果它仍然保持锁定时尝试重新锁定它则获取错误

另一方面,信号量基本上是一个反制者。等待信号量并不一定与获得使用资源的专有权相关联,尽管当然这是一个潜在的应用程序(仅采用值0和1的信号量可以用作互斥体)。信号量可以用于许多其他应用程序,例如等待/信令 - 例如,一个线程可以循环等待信号量N次等待N线程发布到它,其中每个线程发布时它完成了一项任务。实际上,也可以用信号量来实现等同于条件变量的同步对象。它们还可以简单地用作便携式原子计数器(用于递增计数器的过帐),以及许多其他用途。信号量的“经典”用法是表示N等效资源中可用资源的数量,并且在没有可用资源的情况下便于等待,但我个人认为我从未使用过信号量。这一点。

现在,如果您想了解 POSIX 互斥锁和信号量的细节,大多数情况下信号量更强大。它们不仅可用于信号传输条件; post操作也是 async-signal-safe ,这意味着您可以在不受内部信号处理程序限制的情况下使用它。另一方面,互斥体确实有一个功能无法用信号量实现:健壮的互斥属性,它允许您创建允许其他线程/进程在线程时检测和恢复的互斥锁/进程在保持互斥锁时终止(而不仅仅是死锁)。

答案 2 :(得分:0)

因为这是互斥信号量 for 相互排斥(排除除此之外的所有其他线程)。

锁定资源,以便特定的执行线程可以自由访问它。

“常规”信号量(如sem_wait/sem_post中)计算信号量。您可以指定有N个可用资源,而不是根据互斥而只有一个资源。您当然可以使用常规变量来模拟互斥信号量,但是您会丢失一些保护措施(例如确保只有所有者可以解锁它)。