互联网上有很多关于信号量和互斥量差异的文章/问题,但是在线程函数中使用互斥量和信号量是一种很好的方法吗?
像这样(在C中)
pthread_mutex_lock(&mutex);
//(Access to critical section)
sem_wait(&sem);
pthread_mutex_unlock(&mutex);
答案 0 :(得分:2)
在你展示的一段代码中,没有。因为持有互斥锁会阻止任何其他线程进入关键部分。当您需要互斥时,在生产者/消费者设置和互斥锁中使用信号量(只有一个线程执行关键部分)。
相关问题,提供的信息很少:When to use Semaphores and when Mutex
答案 1 :(得分:1)
答案 2 :(得分:0)
我在这个示例Windows控制台程序中使用(windows)互斥和信号量的组合来创建一个内部线程消息传递系统来复制文件。除了设置之外,消息传递功能和线程都很小而且简单。通过等待所有权的互斥锁和信号量来指示消息在队列中并且在单个原子调用中递减具有非零计数的信号量,则发送和接收线程之间的优先级不是问题。
答案 3 :(得分:0)
是的,例如在使用简单链接列表实现的多生产者多消费者队列上。您使用互斥锁来保护基本的链表变量,并使用信号量来表示队列中元素的添加。
void queue_push(...) {
lock mutex
add element to linked list
signal sem
unlock mutex
}
void queue_pop(...) {
start:
wait on sem
lock mutex
if queue is empty: goto start
remove element
unlock mutex
return element
}
答案 4 :(得分:0)
在代码中使用互斥和信号量作为并发原语是不好的编程习惯。相反,您应该使用更高级别的同步和通信原语,并限制互斥和信号量使用以实现更高级别的类型。高级并发类型的示例是线程安全队列,CSP通道(" go channels"),promises / futures和事件对象: