线程同步(信号量、互斥锁)

本文详细介绍了线程同步中的信号量和互斥锁概念及使用方法,包括信号量的初始化、使用、销毁以及互斥锁的初始化、加锁、解锁操作,并给出了简单的应用示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

和多进程程序一样,多线程程序也必须考虑同步问题。线程同步就是一个进程中多个线程协同步调,按预定的先后次序进行运行。pthresd_join可以看作简单的线程同步方式,但是它无法高效地实现复杂的同步需求。

线程同步的方式主要有三种:信号量(Semaphore)、互斥量(Mutex)、条件变量。本文主要阐述了信号量和互斥锁的用法。

信号量


进程同步控制所使用的信号量的函数以sem开头,而在线程中,POSIX信号量函数的名字都以sem_开头。以下六个函数都包含在头文件#include<semaphore.h>,并且以下函数成功时返回0,失败则返回-1并设置errno。

初始化信号量

int sem_init(sem_t* sem,int pshared,unisigned int value);
  • sem 标识操作的信号量,一般是全局变量。
  • pshared 共享,指定此信号量是否在进程间共享。(暂时还不支持,只是留了一个接口,只需设置为0即可)
  • value 设置信号量的初始值(也就是临界资源的个数)。至少为1,否则无法使用。

使用信号量

int sem_wait(sem_t* sem);
  • sem 标识操作的信号量,一般是全局变量。

sem_wait()函数以原子操作的方式将信号量的值减1(相当于P操作)。如果信号量的值为0,则sem_wait()将被阻塞,直到这个信号量具有非零值。

在使用临界资源前,先调用sem_wait()函数,对临界资源的个数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值