C pthread mutex解锁为什么是同一个线程?

C pthread mutex解锁为什么是同一个线程?,c,linux,pthreads,mutex,C,Linux,Pthreads,Mutex,这可能是一个基本问题 1) 为什么应该在同一线程上解锁互斥锁?。我们有什么具体的原因吗? 2) 如果我理解正确,为什么要保持pthraed_mutex_lock,而sem_wait/sem_post可以实现同样的功能?因为互斥信号灯就是为了实现互斥(排除除此之外的所有其他线程) 这是为了锁定一个资源,以便特定的执行线程可以不受限制地访问它 “常规”信号量(如sem\u wait/sem\u post)是计数信号量。根据互斥,您可以指定有可用的N资源,而不仅仅是一个。当然,您可以使用常规的互斥信号

这可能是一个基本问题

1) 为什么应该在同一线程上解锁互斥锁?。我们有什么具体的原因吗?
2) 如果我理解正确,为什么要保持pthraed_mutex_lock,而sem_wait/sem_post可以实现同样的功能?

因为互斥信号灯就是为了实现互斥(排除除此之外的所有其他线程)

这是为了锁定一个资源,以便特定的执行线程可以不受限制地访问它


“常规”信号量(如
sem\u wait/sem\u post
)是计数信号量。根据互斥,您可以指定有可用的
N
资源,而不仅仅是一个。当然,您可以使用常规的互斥信号量来模拟互斥信号量,但您会失去一些保护(例如,确保只有所有者可以解锁它)。

互斥在最常见的情况下被设计为极快且轻量级。最常见的情况是线程进入关键部分,对共享状态进行一些快速更改,然后退出关键部分。如果您有更复杂的需求,请使用更复杂的同步对象。但通常,pthread互斥比几乎任何其他同步原语都要轻。

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

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

另一方面,信号量基本上是一个计数器。等待信号量不一定与获得使用资源的独占权限有关,当然这是一个潜在的应用程序(只接受值0和1的信号量可以用作互斥对象)。信号量可用于许多其他应用程序,如等待/发信号-例如,一个线程可以循环等待信号量
N
次,以等待
N
线程向其发送,其中每个线程在完成任务时发送。事实上,也可以根据信号量实现与条件变量等价的同步对象。在许多其他用途中,它们也可以简单地用作便携式原子计数器(以增加计数器的数量)。信号量的“经典”用法是表示
N
等效资源中可用资源的数量,并在没有可用资源时方便等待,但我个人认为我从未使用过这样的信号量

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