pthread库提供的信号量和互斥量有什么区别?
sem_t
在共享内存中,并使用它在进程之间同步操作。另一方面,即使您不创建多个线程,也必须进行编译和链接-pthread
才能使用pthread_mutex_*
。(某些平台不强制执行此操作,但这是标准。)
man sem_init
在Linux中说:Link with -pthread.
所以我想Linux并不遵循POSIX。
pthread库提供的信号量和互斥量有什么区别?
sem_t
在共享内存中,并使用它在进程之间同步操作。另一方面,即使您不创建多个线程,也必须进行编译和链接-pthread
才能使用pthread_mutex_*
。(某些平台不强制执行此操作,但这是标准。)
man sem_init
在Linux中说:Link with -pthread.
所以我想Linux并不遵循POSIX。
Answers:
信号量具有同步计数器,互斥量仅是二进制的(真/假)。
信号量通常用作回答正在使用资源的多少元素的确定机制-例如,表示n个工作线程的对象可能使用信号量来计算有多少个工作线程可用。
事实是,您可以通过由互斥锁同步的INT来表示信号量。
我将谈论Mutex与Binary-Semaphore。您显然使用互斥锁来防止一个线程中的数据同时被另一个线程访问。
(假设您刚刚调用过lock(),并且正在访问数据。这意味着,您不希望任何其他线程(或同一线程代码的另一个实例)访问由锁锁定的相同数据。相同的互斥锁。也就是说,如果在不同的线程实例上执行的是同一线程代码,则会命中该锁,然后lock()应该会阻塞控制流。
这适用于使用不同线程代码的线程,该线程代码也正在访问相同的数据,并且也被相同的互斥锁锁定。
在这种情况下,您仍处于访问数据的过程中,并且可能需要花费15秒钟的时间才能达到互斥锁解锁(这样,在互斥锁中被阻塞的另一个线程将解除阻塞并允许控件访问数据)。
您是否曾经允许另一个线程仅解锁相同的互斥锁,然后又允许互斥锁中已在等待(阻塞)的线程解除阻塞并访问数据?(希望您明白我在这里说的话。)
根据公认的通用定义,
因此,如果您非常在意使用二进制信号量而不是互斥量,那么您应该非常谨慎地“确定”锁定和解锁范围,我的意思是,碰到每个锁的每个控制流都应该碰到一个解锁调用不应有任何“首次解锁”,而应始终是“首次锁定”。
互斥锁用于避免多个线程之间的竞争状态。
信号量用作跨多个进程使用的同步元素。
互斥锁不能用二进制信号量代替,因为,一个进程等待信号量,而另一个进程释放信号量。在互斥锁的情况下,获取和释放都由相同的对象处理。
厕所的例子
互斥体:
是上厕所的钥匙。一个人可以当时拥有钥匙-上厕所。完成后,该人将密钥提供(释放)给队列中的下一个人。
“ Mutexe通常用于序列化不能由多个线程同时执行的可重入代码段的访问。互斥对象仅允许一个线程进入受控段,从而迫使其他试图访问该段的线程等到第一个线程从该部分退出。”
(互斥量实际上是值为1的信号量。)
信号:
是免费的相同马桶钥匙的数量。例如,假设我们有四个具有相同锁和钥匙的卫生间。信号量计数(键的计数)在开始时设置为4(所有四个洗手间都是免费的),然后计数值随着人们的进来而递减。没有剩余的可用键,信号量为0。一个人离开洗手间,信号量增加到1(一个自由键),并交给队列中的下一个人。
“信号量将共享资源的同时用户数限制为最大数量。线程可以请求访问该资源(减少信号量),并可以发出信号,表明他们已完成使用该资源(增加信号量)。”
semaphore
和之间的mutex
区别是机制和模式之间的区别。它们的目的(意图)和工作方式(行为)不同。
的mutex
,barrier
,pipeline
是并行编程模式。Mutex
用于(旨在)保护critical section
和确保mutual exclusion
。Barrier
使代理(线程/进程)保持彼此等待。
的特征(行为)之一mutex
模式是,只有允许的代理(进程或线程)可以进入关键部分,而只有该代理可以自愿退出。
在某些情况下,一次mutex
允许一个代理。在某些情况下,它允许多个代理(多个读者)而不允许某些其他代理(作家)。
的semaphore
是一种机制,可用于(意图)来实现不同的图案。通常,它是(行为)一个标志(可能受到互斥保护)。(一个有趣的事实是甚mutex
至可以使用模式来实现信号量)。
在流行文化中,semaphores
内核提供了一些机制,并且mutexes
,用户空间库提供。
请注意,关于semaphores
和存在误解mutexes
。它说semaphores
用于synchronization
。并且mutexes
有ownership
。这是由于流行的OS书籍。但事实是所有互斥量,信号量和障碍都用于同步。互斥的目的不是,ownership
而是mutual exclusion
。这种误解引起了受欢迎的面试问题的提出,mutexes
并要求两者之间的区别binary-semaphores
。
概要,
意图从设计角度看,mutex
更像state-pattern
是状态选择的算法可以更改状态的地方。这binary-semaphore
更像strategy-pattern
是外部算法可以更改状态并最终选择要运行的算法/策略的地方。
互斥锁只能应用于单个进程中的线程,不能像信号量一样在进程之间工作。