有如下代码:
class MyClass {
public:
void doWork() {
std::this_thread::sleep_for(std::chrono::milliseconds(500));
std::cout << "ID потока: " << std::this_thread::get_id() << "\tdoWork started\t" << "\n";
std::this_thread::sleep_for(std::chrono::milliseconds(2000));
std::cout << "ID потока: " << std::this_thread::get_id() << "\tdoWork stopped\t" << "\n";
};
void doWork2(int a) {
std::this_thread::sleep_for(std::chrono::milliseconds(500));
std::cout << "ID потока: " << std::this_thread::get_id() << "\tdoWork2 started\t" << "\n";
std::this_thread::sleep_for(std::chrono::milliseconds(2000));
std::cout << "Значение параметра doWork2 " << a;
std::cout << "ID потока: " << std::this_thread::get_id() << "\tdoWork2 stopped\t" << "\n";
};
int sum(int a, int b) {
std::this_thread::sleep_for(std::chrono::milliseconds(500));
std::cout << "ID потока: " << std::this_thread::get_id() << "\tsum started\t" << "\n";
std::this_thread::sleep_for(std::chrono::milliseconds(2000));
std::cout << "ID потока: " << std::this_thread::get_id() << "\tsum stopped\t" << "\n";
return a + b;
}
};
int main() {
setlocale(LC_ALL, "ru");
MyClass class1;
std::thread th1(&MyClass::doWork, class1);
for (int i = 0; i < 3; ++i) {
std::cout << "ID потока: " << std::this_thread::get_id() << "\tmain work\t" << i << "\n";
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
};
th1.join();
return 0;
}
我正确地理解需要 join ,以便如果 main 提前完成,程序将等待 th1 创建的线程完成?
我也不太明白需要分离的情况。
detach 只会“让流自由浮动”,那么如何从中获取结果以及在什么情况下应该使用它而不是 join?
谢谢
一旦线程启动,该实例
std::thread
就成为正在运行的线程的所有者。阻塞调用join
等待线程完成并释放关联的资源,从而允许先前创建的对象(可能已被终止线程中的代码引用)正常终止。此调用是强制性的。调用仍然是正在运行的线程的所有者的实例的析构函数std::thread
会导致程序崩溃。detach
文字代码中的调用是不必要的,并且通常是一个错误。唯一可以证明它们的使用是合理的情况是在线程中调用第三方函数并无限期地阻塞它。然后,在创建没有相应调用的线程时,该调用detach
可以用作一种灾难性较小的替代方法,可以避免故意泄漏资源。new
delete
在 C++20 中,出现了一个类
std::jthread
,它具有内置机制,用于通知需要终止线程,并且它本身join
在析构函数中调用它。