线程互斥

概念

共享资源:多个线程或进程同时访问的资源,叫做共享资源。
临界区:多个线程访问共享资源的代码,构成了临界区。
临界区竞争:多个线程对共享资源的写入,会造成临界区竞争

POSIX有名信号量

这种有名信号量的名字类似“/somename”这样的字符串组成,注意前面有一个正斜杠,这样的信号量其实是一个特殊的文件,创建成功之后将会被放置在系统的一个特殊的虚拟文件系统/dev/shm之中,不同的进程间只要约定好一个相同的名字,他们就可以通过这种有名信号量来相互协调。
值得一提的是,有名信号量和system-V的信号量都是系统范畴的,在进程退出之后他们并不会自动消失,而需要手动删除并释放资源。
POSIX有名信号量的一般使用步骤是:
1.使用sem_open()来创建或打开一个有名信号量
2.使用sem_wait()和sem_post来分别进行P操作和V操作
3.使用sem_close()来关闭他
4.使用sem_unlink()来删除它,并释放系统资源
在这里插入图片描述
在这里插入图片描述
不像system-V的信号来给可以申请或者释放超过1个资源,对于POSIX信号量而言,每次申请和释放的资源数都是1,其中sem_wait()在资源为0时会导致阻塞,如果不像阻塞等待,可以使用sem_trywait来替代。
sem

POSIX无名信号量

如果我们要解决的是一个进程内部的线程间的同步互斥,那么也许不需要使用有名信号量,因为这些线程共享同一个内存空间,我们可以定义更加轻量化的、基于内存的(不在任何文件系统内部)无名信号量来达到目的
这种信号量的使用步骤是:
1.在这些线程都能访问到的区域定义这种变量(比如全局变量),类型是sem_t.
2.在任何线程使用它之前,用sem_init初始化他。
3.使用sem_wait或sem_trywait和sem_post来分别进行P、V操作
4.不在需要时,使用sem_destroy来销毁它

在这里插入图片描述
无名信号量一般用在进程内的线程之间,因此pshared参数一般都为0。当将此种信号量用在进程间时,必须将他定义在各个进程都能访问的地方–比如共享内存之中。
对于system-V信号量、POSIX有名信号量以及POSIX无名信号量

  1. sys-V信号量较古老,语法艰涩。POSIX信号量简单,轻量
  2. sys-V信号量可以对代表多种资源的多个信号量元素同一时间进行原子性的P/V操作,POSIX信号量每次只能操作一个信号量。
  3. sys-V信号量和有名信号量是系统范围的资源,进程消失后继续存在,而无名信号量是进程范围内的资源,随着进程的退出而消失
  4. sys-V信号量的P/V操作可以对信号量元素加减大于1的数值,而POSIX信号量每次P/V操作都是加减1
  5. sys-V信号量甚至还支持撤销操作–一个进程对sys-V信号量进行P/V操作时可以给该操作贴上需要撤销的标识,那么当进程退出之后,系统会自动撤销那些做了标识的操作,而POSIX信号没有此功能
  6. sys-V信号量和named-sem适合用在进程间同步互斥,而无名信号量适合用在线程间同步互斥

造成函数不可重入的因素

  1. 因为函数内部使用了共享资源,比如全局变量、环境变量
  2. 因为函数内部调用了其他不可重入函数
  3. 因为函数执行结果与某硬件设备相关

怎样写出一个线程安全的可重入函数

  1. 不适用任何静态数据,只使用局部变量或者堆内存
  2. 不调用任何非线程安全的不可重入函数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值