C/C++:互斥锁和条件变量

本文介绍了C/C++中互斥锁和条件变量的使用,包括互斥锁的初始化、加锁、解锁、非阻塞加锁和销毁,以及条件变量的初始化、等待、唤醒和销毁。互斥锁用于保护临界资源,条件变量则允许线程等待特定条件的发生。文中还展示了如何结合两者实现生产者消费者模型。
摘要由CSDN通过智能技术生成

       互斥锁、条件变量和信号量是实现线程间同步的三种方式。在多线程程序访问临界资源时,可以对各个线程进行访问限制,每次只允许一个线程访问临界资源。条件变量相当于是互斥锁的一种补充,是线程中的东西,就是等待某一条件的发生,和信号一样。占有临界资源的线程在执行完对于资源的操作后,会发出“信号”,然后其它未占有资源的线程在感知到“信号”后就会抢占资源。

互斥锁的使用

需要的头文件:pthread.h
1)定义并初始化互斥锁

函数原型:pthread_mutex_t mutex;
                  int  pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mattr)
参数说明:mutex互斥锁地址,mattr属性通常默认nullptr,可以用于设置互斥锁的特性。

互斥锁属性:

  • PTHREAD_MUTEX_NORMAL,在同一线程中重复锁定互斥锁会导致死锁。如果某个线程尝试解除锁定的互斥锁不是由该线程锁定或未锁定,则将产生不确定的行为。
  • PTHREAD_MUTEX_ERRORCHECK提供错误检查。如果某个线程尝试重新锁定的互斥锁已经由该线程锁定,则将返回错误。如果某个线程尝试解除锁定的互斥锁不是由该线程锁定或者未锁定,则将返回错误。
  • PTHREAD_MUTEX_RECURSIVE一个线程可以多次锁定同一个互斥锁,互斥锁会保留一个锁定计数。线程首次成功获取互斥锁时,锁定计数会设置为 1。线程每重新锁定该互斥锁一次,锁定计数就增加 1。线程每解除锁定该互斥锁一次,锁定计数就减小 1。 锁定计数达到 0 时,该互斥锁即可供其他线程获取。如果某个线程尝试解除锁定的互斥锁不是由该线程锁定或者未锁定,则将返回错误。

2)互斥锁加锁

函数原型:int pthread_mutex_loc

  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值