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

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

互斥锁的使用

需要的头文件: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
    评论
互斥锁条件变量C++常用的线程同步机制,用于控制多个线程之间的并发访问和操作。 1.互斥锁(Mutex) 互斥锁是一种互斥对象,用于保护共享资源,确保同时只有一个线程访问该资源。当一个线程获得了互斥锁后,其他线程就无法再访问该资源,直到该线程释放了互斥锁。在C++11标准,可以使用std::mutex类来创建互斥锁。 示例代码: ``` #include <iostream> #include <thread> #include <mutex> std::mutex mtx; // 创建互斥锁 void print(char ch) { mtx.lock(); // 加锁 for (int i = 0; i < 5; ++i) { std::cout << ch; } std::cout << std::endl; mtx.unlock(); // 解锁 } int main() { std::thread t1(print, 'A'); std::thread t2(print, 'B'); t1.join(); t2.join(); return 0; } ``` 2.条件变量(Condition Variable) 条件变量是一种同步机制,用于协调多个线程之间的操作。当一个线程等待某个条件成立时,可以通过条件变量使其进入休眠状态,等待其他线程满足该条件并唤醒它。在C++11标准,可以使用std::condition_variable类来创建条件变量。 示例代码: ``` #include <iostream> #include <thread> #include <mutex> #include <condition_variable> std::mutex mtx; std::condition_variable cv; bool ready = false; void print(char ch) { std::unique_lock<std::mutex> lock(mtx); // 创建unique_lock对象 while (!ready) { // 等待条件成立 cv.wait(lock); // 进入休眠状态 } for (int i = 0; i < 5; ++i) { std::cout << ch; } std::cout << std::endl; } int main() { std::thread t1(print, 'A'); std::thread t2(print, 'B'); std::this_thread::sleep_for(std::chrono::seconds(2)); // 等待2秒钟 { std::lock_guard<std::mutex> lock(mtx); // 创建lock_guard对象 ready = true; // 修改条件变量的值 } cv.notify_all(); // 唤醒所有等待的线程 t1.join(); t2.join(); return 0; } ``` 上述代码,创建了一个条件变量cv和一个bool类型的变量ready。在print函数,线程会进入while循环,等待ready变量为true,然后打印字符。在主线程,等待2秒钟后,将ready变量设置为true,并通过notify_all()函数唤醒所有等待的线程。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值