c++中的互斥锁、条件变量说一下?
时间: 2024-06-09 13:04:59 浏览: 223
互斥锁和条件变量是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()函数唤醒所有等待的线程。
阅读全文