繁体   English   中英

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

[英]pthread mutex unlock why same thread?

可能是个基本问题?

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

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

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

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

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

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

因为这是互斥信号量的用途,互斥(除了这个以外的所有其他线程除外)。

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

“常规”信号量(如sem_wait/sem_post )是计数信号量。 您可以指定有N资源可用,而不是根据互斥而只有一个资源。 你当然可以模仿常规变种的互斥信号量但你失去了一些保护措施(例如确保只有主人可以解锁它)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM