子线程 join 会阻塞 主线程吗
时间: 2023-11-04 21:39:52 浏览: 70
会阻塞主线程。`join()` 方法会等待子线程执行完毕后再继续执行主线程,如果子线程的执行时间很长,那么主线程就会被阻塞。因此,在使用 `join()` 方法时,需要谨慎考虑子线程的执行时间,避免对主线程的影响。如果不希望阻塞主线程,可以通过设置子线程的 `daemon` 属性为 `True` 来实现,这样子线程会在主线程结束时自动退出。
相关问题
java 中 子线程 join 会阻塞其他子线程吗
Java中,使用join方法会使当前线程(一般是主线程)等待该线程执行完毕。但是不会阻塞其他子线程的执行。其他子线程依然可以并发执行,只是当前线程会等待被join的线程执行结束后再继续执行。
举个例子,假设有两个子线程A和B,主线程调用了线程A的join方法,那么主线程会等待线程A执行完毕,但是线程B仍然可以并发执行。只是当线程A执行完毕后,主线程才会继续执行。
C++ 开启子线程进行异步操作,主线程不阻塞,子线程运行结束后获取结果发送到主线程显示
在C++中,你可以使用`std::thread`库来创建子线程进行异步操作。为了实现主线程不阻塞并等待子线程完成后再获取结果,可以借助条件变量`std::condition_variable`或者`std::future`。
下面是一个简单的示例:
```cpp
#include <iostream>
#include <thread>
#include <mutex> // For std::mutex and std::lock_guard
#include <condition_variable> // For std::condition_variable
// 这里假设我们有一个函数runTask()将在子线程中执行,并返回结果
int runTask(int input) {
std::this_thread::sleep_for(std::chrono::seconds(2)); // 模拟耗时操作
return input * 2;
}
void workerThread(int input, std::condition_variable& cv, std::mutex& mtx) {
int result = runTask(input);
{
std::unique_lock<std::mutex> lock(mtx);
cv.notify_one(); // 主线程可以继续了
}
std::cout << "Worker thread finished, result is: " << result << std::endl;
}
int main() {
std::mutex mtx; // 用于同步主线程和子线程
std::condition_variable cv; // 创建条件变量
int input = 5;
// 创建子线程
std::thread worker(workerThread, input, cv, mtx);
// 在这里,主线程不阻塞,而是等待cv被唤醒
cv.wait(lock_guard<std::mutex>(mtx), []{return worker.joinable();});
// 等待子线程结束,并获取结果
worker.join();
// 显示子线程的结果
std::cout << "Result from the worker thread: " << input << "\n";
return 0;
}
```
在这个例子中,`workerThread`在子线程中执行,主线程通过`cv.wait`阻塞直到子线程结束并唤醒。子线程完成后,将结果放入全局可访问的数据结构(在这里省略),然后主线程再获取并显示结果。
阅读全文