c++ 条件变量的用法举例 ,使用Std:thread
时间: 2023-05-24 15:03:56 浏览: 68
A:条件变量通常用于同步多个线程之间的行为。一个线程等待某个条件成立,而另一个线程会在条件成立时通知等待线程。在C++中,可以使用std::condition_variable来实现条件变量。
以下是一个使用std::condition_variable的示例程序,它创建了两个线程,一个线程负责生产数据,另一个线程负责消费数据。两个线程通过条件变量和互斥锁进行同步。
```
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
std::mutex mutex_;
std::condition_variable condVar;
int data = 0;
bool readyToRead = false;
void writeData() {
std::cout << "Producing data...\n";
std::this_thread::sleep_for(std::chrono::seconds(2)); // simulate time-consuming operation
{
std::unique_lock<std::mutex> lock(mutex_);
data = 123;
readyToRead = true;
}
condVar.notify_one();
}
void readData() {
std::unique_lock<std::mutex> lock(mutex_);
while (!readyToRead) {
std::cout << "Waiting for data...\n";
condVar.wait(lock);
}
std::cout << "Consuming data: " << data << "\n";
}
int main() {
std::thread producer(writeData);
std::thread consumer(readData);
producer.join();
consumer.join();
return 0;
}
```
在这个程序中,writeData和readData两个函数分别在两个线程中运行。writeData函数等待一段时间,然后将data变量设置为123,同时将readyToRead设置为true,表示数据已经准备好了。然后通过condVar.notify_one()通知正在等待的线程(在readData中)。
readData函数会等待数据准备好的条件出现。如果数据还没有准备好,它会调用condVar.wait(lock)进行等待。当数据准备好时,它会释放锁并输出数据。如果没有条件变量,这个程序可能会陷入死锁状态,因为两个线程都需要互斥访问data变量。但是通过使用条件变量,线程可以在数据准备好的时候立即得到通知,从而避免了死锁。