优点:
"信号量是异步信号安全的"(参考[2])
缺点:
"我认为信号量不是必备的同步原语,因为条件变量配合互斥器可以完全替代其功能,且更不容易出错...信号量的另一个问题在于它有自己的计数值,而通常我们自己的数据结构也有长度值,这就造成了同样的信息存了两份"(参考[1])
"一个线程能够递增一个被另一个线程递减的信号量,这种灵活性会导致产生结构糟糕的同步设计"(参考[2])
结论:
信号量应用场合,可以考虑用互斥锁+条件变量进行代替。
信号量犹如并发编程中的"goto"一般,但是,它确实接口简单,调用方便。
------------------------------------------
另外,更正自己一个错误的观念:数值1的信号量等价于互斥锁。
只需要动手写一个单生产者-单消费者的demo就能明白。
例子1:
1 // 编码线程 2 thread_encode(){ 3 sem_wait(&task_assigned); // 阻塞等待任务 4 encode(); 5 sem_post(&task_done); // 通知任务完成 6 } 7 // 任务线程 8 thread_main(){ 9 sem_wait(&task_done); // 阻塞等待任务完成 10 send_data_if_has(); 11 new_task(); 12 sem_post(&task_assigned); // 通知任务下发 13 } 14 sem_init(&task_done,0,1); // 初始状态,"任务已完成" 15 sem_init(&task_assigned,0,0); // 没有新分配任务
对比例子2
1 // 编码线程 2 thread_encode(){ 3 pthread_mutex_lock(&mutex); 4 encode(); 5 pthread_mutex_unlock(&mutex); 6 } 7 // 任务线程 8 thread_encode(){ 9 pthread_mutex_lock(&mutex); 10 send_data_if_has(); 11 new_task(); 12 pthread_mutex_unlock(&mutex); 13 }
区别
参考
[1]《Linux多线程服务端编程》第二章 线程同步精要 2.3 不要用读写锁和信号量
[2]《Linux编程手册》P907 POSIX信号量于Pthreads互斥体对比
原文:https://www.cnblogs.com/i-am-normal/p/11710788.html