使用信号量和互斥量是一种好方法吗?

时间:2014-11-26 09:23:07

标签: c multithreading

互联网上有很多关于信号量和互斥量差异的文章/问题,但是在线程函数中使用互斥量和信号量是一种很好的方法吗?

像这样(在C中)

pthread_mutex_lock(&mutex);
//(Access to critical section)
sem_wait(&sem);

pthread_mutex_unlock(&mutex);

5 个答案:

答案 0 :(得分:2)

在你展示的一段代码中,没有。因为持有互斥锁会阻止任何其他线程进入关键部分。当您需要互斥时,在生产者/消费者设置和互斥锁中使用信号量(只有一个线程执行关键部分)。

相关问题,提供的信息很少:When to use Semaphores and when Mutex

答案 1 :(得分:1)

由于它们的实现相似,互斥量将被称为二进制信号量。实际上他们是不同的。

  • 互斥锁是用于同步对资源的访问的锁定机制。
  • 信号量是信号机制

This Link可以澄清你的怀疑

答案 2 :(得分:0)

我在这个示例Windows控制台程序中使用(windows)互斥和信号量的组合来创建一个内部线程消息传递系统来复制文件。除了设置之外,消息传递功能和线程都很小而且简单。通过等待所有权的互斥锁和信号量来指示消息在队列中并且在单个原子调用中递减具有非零计数的信号量,则发送和接收线程之间的优先级不是问题。

http://rcgldr.net/misc/mtcopy.zip

答案 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和事件对象: