线程通信 一对多消息同步
时间: 2024-02-15 19:35:36 浏览: 22
线程通信中,一对多消息同步的实现可以通过使用信号量或条件变量来实现。在这种情况下,一个线程(通常是主线程)将消息发布到所有的线程,然后等待所有线程都完成了相应的操作之后再继续执行。具体实现时,可以使用一个计数器来记录已经完成操作的线程数量,当所有线程都完成操作时,计数器的值达到预设的值时,主线程就可以继续执行。
例如,一个场景可以是一个主线程和多个工作线程,主线程需要等待所有工作线程都完成任务之后才能执行下一步操作。这时可以使用条件变量和互斥锁来实现:
```c++
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <vector>
std::mutex mtx; // 互斥锁
std::condition_variable cv; // 条件变量
int count = 0; // 计数器
const int THREAD_NUM = 5; // 线程数
void work(int id) {
// 模拟任务执行
std::this_thread::sleep_for(std::chrono::milliseconds(100 * id));
std::unique_lock<std::mutex> lock(mtx);
count++; // 完成任务,计数器加一
cv.notify_all(); // 通知主线程
}
int main() {
std::vector<std::thread> threads;
for (int i = 0; i < THREAD_NUM; i++) {
threads.emplace_back(work, i);
}
std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock, []() { return count == THREAD_NUM; }); // 等待所有线程完成任务
std::cout << "All threads have finished their work." << std::endl;
for (auto& t : threads) {
t.join();
}
return 0;
}
```
在这个例子中,所有工作线程将完成任务后,会调用 `cv.notify_all()` 来通知主线程,同时主线程会使用 `cv.wait()` 来等待所有工作线程都完成任务。等待过程中,主线程会释放锁,让其他线程可以执行。当所有线程都完成任务后,主线程会重新获得锁,然后继续执行后面的操作。
这种方式可以保证所有线程都完成了任务之后,主线程才会执行下一步操作,从而实现了一对多消息同步。