C++ 线程间通信代码
时间: 2023-11-14 18:59:13 浏览: 187
基于C++语言的多线程之间的通讯编程
C++ 中线程间通信可以使用互斥锁(mutex)、条件变量(condition variable)等机制来实现。下面是一个简单的例子:
```c++
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
std::mutex mtx;
std::condition_variable cv;
bool ready = false;
void funcA() {
// 这里做一些耗时的操作
std::this_thread::sleep_for(std::chrono::seconds(1));
// 加锁
std::unique_lock<std::mutex> lck(mtx);
// 设置 ready 标志位为 true
ready = true;
// 通知等待的线程
cv.notify_all();
}
void funcB() {
// 加锁
std::unique_lock<std::mutex> lck(mtx);
// 等待 ready 标志位为 true
cv.wait(lck, []{ return ready; });
// ready 标志位为 true 时执行下面的代码
std::cout << "Hello, world!" << std::endl;
}
int main() {
// 创建两个线程
std::thread t1(funcA);
std::thread t2(funcB);
// 等待两个线程结束
t1.join();
t2.join();
return 0;
}
```
其中,`funcA` 线程会在执行完一些耗时的操作后设置 `ready` 标志位为 true,并通知等待的线程。`funcB` 线程会等待 `ready` 标志位为 true 后输出一条消息。
在这个例子中,我们使用了一个互斥锁和一个条件变量来实现线程间通信。`std::unique_lock` 是一个 RAII 封装的互斥锁,它可以自动释放锁。`std::condition_variable` 是一个条件变量,它可以在等待时自动释放锁,并在通知时重新获取锁。在等待时,`cv.wait(lck, predicate)` 会释放锁并等待条件变量被通知。`predicate` 是一个可调用对象,用于判断条件是否满足。在通知时,`cv.notify_all()` 会通知所有等待的线程,并重新获取锁。
阅读全文