c++多线程通信实现
时间: 2023-08-20 19:04:04 浏览: 127
实现多线程通信的典型方法是使用同步原语,例如信号量和互斥锁。以下是使用互斥锁和条件变量实现多线程通信的示例代码:
```c++
#include <mutex>
#include <condition_variable>
#include <thread>
#include <iostream>
#include <queue>
std::mutex mtx;
std::condition_variable cv;
std::queue<int> q;
void producer() {
for (int i = 0; i < 10; ++i) {
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
std::unique_lock<std::mutex> lck(mtx);
q.push(i);
std::cout << "Produced: " << i << std::endl;
cv.notify_one();
}
}
void consumer() {
while (true) {
std::unique_lock<std::mutex> lck(mtx);
cv.wait(lck, []{ return !q.empty(); });
int val = q.front();
q.pop();
std::cout << "Consumed: " << val << std::endl;
}
}
int main() {
std::thread prod(producer);
std::thread cons(consumer);
prod.join();
cons.join();
return 0;
}
```
在这个例子中,生产者线程和消费者线程共享一个队列 `q`。生产者线程不断地往队列里添加元素,消费者线程则不断地从队列中取出元素进行消费。生产者线程和消费者线程之间通过互斥锁和条件变量进行同步。当队列为空时,消费者线程会等待生产者线程往队列中添加元素并通知它,而生产者线程在往队列中添加元素后会通知消费者线程。
需要注意的是,使用多线程时需要考虑线程安全问题,例如对共享变量的访问可能会导致数据竞争。在这个例子中,我们使用互斥锁保护共享变量 `q` 的访问,避免了数据竞争问题。
阅读全文