浅谈并行程序设计中互斥量(Pthreads Mutexes)与信号量(Semaphores)的区别

来源:互联网 发布:360便签软件 编辑:程序博客网 时间:2024/05/20 05:07

出于对忙等待busy-waiting)的优化,我们有两种更好的办法:互斥量信号量


互斥量

互斥量是互斥锁的简称,是一个特殊类型的变量,通过某些函数,互斥量可以用来限制每次只有一个线程进入临界区。

临界区:就是一个更新共享资源的代码段,一次只允许一个线程执行此代码段。

Pthread标准为互斥量提供了一个特殊类型:pthread_mutex_t,除了初始化函数和摧毁函数,在获取临界区的访问和退出临界区我们需调用这里写图片描述
以用累加求和计算pai来示例互斥量用法
这里写图片描述


信号量

信号量类似于一种特殊类型的unsigned int变量,可以赋值为0、1、2…大多数情况只赋值为0和1,把这种信号量称为二元信号量。粗略地说,0可以类比于上了锁的互斥量,1对应于未上锁的互斥量。调用函数为这里写图片描述


注意:信号量并不是Pthreads线程库的一部分,所以使用时要加上头文件
这里写图片描述
那么以生产者-消费者同步模型为例
具体分析等期末考试完了再补充哈


那么两种方法有什么区别么?

敲黑板:信号量与互斥量最大的区别在于信号量是没有个体拥有权的,但是互斥量则更像每个线程私有的,互斥量必须由同一线程进行加锁和解锁,但是信号量却可以由一个线程释放,另一个线程得到。

信号量多用于多线程同步用的,将一个线程的某个动作就通过信号告诉别的线程完成同步功能。而互斥量则是用于多线程互斥用的,比如对共享资源的独自占用,那么别的线程就无法访问,直到此线程完成,其他的线程才可以进入这个资源。

另:互斥量和信号量的底层操作都是原子操作实现哒,故不会存在额外冲突。(详情也等期末考完再说吧哭哭祝期末考个好成绩)

阅读全文
0 0