C++ 使用条件变量、原子操作的例子
时间: 2023-12-02 13:05:01 浏览: 120
C++ 例子
下面是一个使用条件变量和原子操作的例子,该例子实现了一个线程安全的生产者/消费者模型:
```cpp
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <queue>
#include <atomic>
std::queue<int> q;
std::mutex q_mutex;
std::condition_variable q_cv;
std::atomic<int> count{0};
void producer()
{
while (true) {
std::unique_lock<std::mutex> lock(q_mutex);
q.push(count++);
lock.unlock();
q_cv.notify_one();
}
}
void consumer()
{
while (true) {
std::unique_lock<std::mutex> lock(q_mutex);
q_cv.wait(lock, [](){ return !q.empty(); });
std::cout << "consumer: " << q.front() << std::endl;
q.pop();
lock.unlock();
}
}
int main()
{
std::thread t1(producer);
std::thread t2(consumer);
std::thread t3(consumer);
t1.join();
t2.join();
t3.join();
return 0;
}
```
在这个例子中,生产者线程不断产生数据并把它们放入队列中,消费者线程则等待队列中有数据可用时取出并处理它们。为了保证线程安全,我们使用了一个互斥量 `q_mutex` 来保护队列的访问,使用条件变量 `q_cv` 来同步生产者和消费者线程。在生产者线程中,我们首先获取了 `q_mutex` 的独占锁,然后将数据加入队列,并通过 `q_cv` 通知消费者线程有新数据可用。在消费者线程中,我们首先获取了 `q_mutex` 的独占锁,并调用 `q_cv.wait()` 来等待新数据的到来,这个调用会自动释放 `q_mutex` 的独占锁,并使消费者线程进入阻塞状态。当生产者线程通过 `q_cv.notify_one()` 通知有新数据可用时,消费者线程会被唤醒并重新获得 `q_mutex` 的独占锁。如果队列中有数据可用,我们就取出队列头部的数据并打印出来。需要注意的是,我们使用了一个 lambda 表达式作为 `q_cv.wait()` 的第二个参数,这个表达式用来检查队列是否为空,如果为空就继续等待。这里使用了原子变量 `count` 来表示生产的数据的编号,以便于调试和观察。
阅读全文