【随笔】信号量和互斥锁的对比

优点:

"信号量是异步信号安全的"(参考[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互斥体对比

猜你喜欢

转载自www.cnblogs.com/i-am-normal/p/11710788.html