在C++中,如果你想要让主线程等待其他线程完成它们的任务,你可以使用多种同步机制。以下是一些常用的方法:
std::thread
和std::future
std::future
和std::promise
可以用来在线程之间传递结果,并且可以让主线程等待子线程完成。
#include <iostream>
#include <thread>
#include <future>
void worker(std::promise<int> result_promise) {
// 模拟耗时操作
std::this_thread::sleep_for(std::chrono::seconds(2));
result_promise.set_value(42); // 设置结果值
}
int main() {
std::promise<int> result_promise;
std::future<int> result_future = result_promise.get_future();
std::thread t(worker, std::move(result_promise));
// 主线程等待子线程完成
int result = result_future.get(); // 阻塞直到结果可用
std::cout << "Result: " << result << std::endl;
t.join(); // 确保线程资源被正确释放
return 0;
}
std::condition_variable
std::condition_variable
可以用来通知主线程某个条件已经满足,通常与std::mutex
一起使用。
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
std::mutex mtx;
std::condition_variable cv;
bool ready = false;
void worker() {
// 模拟耗时操作
std::this_thread::sleep_for(std::chrono::seconds(2));
{
std::lock_guard<std::mutex> lock(mtx);
ready = true;
}
cv.notify_one(); // 通知等待的线程
}
int main() {
std::thread t(worker);
{
std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock, []{ return ready; }); // 阻塞直到条件满足
}
std::cout << "Worker thread has finished!" << std::endl;
t.join();
return 0;
}
std::atomic
如果你只是需要简单的同步,而不需要传递数据,可以使用std::atomic
变量。
#include <iostream>
#include <thread>
#include <atomic>
std::atomic<bool> done(false);
void worker() {
// 模拟耗时操作
std::this_thread::sleep_for(std::chrono::seconds(2));
done = true;
}
int main() {
std::thread t(worker);
while (!done) {
// 忙等待,实际应用中可能不是最佳选择
}
std::cout << "Worker thread has finished!" << std::endl;
t.join();
return 0;
}
std::future
和std::promise
适用于需要传递结果的场景。std::condition_variable
适用于复杂的同步逻辑,需要配合std::mutex
使用。std::atomic
适用于简单的布尔标志同步。选择合适的同步机制取决于具体的应用场景和需求。在实际开发中,应根据具体情况选择最合适的同步策略。
领取专属 10元无门槛券
手把手带您无忧上云