std::thread::detach销毁 1. 解释std::thread::detach的含义 std::thread::detach 是C++11 标准库中 std::thread 类的一个成员函数,它用于将线程从 std::thread 对象中分离出来,允许线程独立执行。一旦线程被分离,原始的 std::thread 对象将不再与该线程有任何关联。分离后的线程将在后台运行,直到线程函数执...
detach: detach 线程。 将当前线程对象所代表的执行实例与该线程对象分离,使得线程的执行可以在后台单独进行。 意味着主线程不需要等待子线程执行完毕才能往下继续执行(不阻塞主线程)。 一旦线程执行完毕,它所分配的资源将会被释放。 调用detach 函数之后: *this 不再代表任何的线程执行实例。♨️ joinable() =...
线程的join与detach 线程的销毁(析构函数) hardware_concurrency函数 注意事项 std::thread类 c++11提供了方便的线程管理类std::thread,位于#include <thread>头文件中,下面是个简单的示例: void thread_func() { std::cout << "hello multi-thread! " << std::endl; } int main () { for(int i = ...
thread::join 和 thread::detach 都会让 thread 进入 unjoinable 状态,unjoinable状态下的 thread 可以安全销毁。 使用thread默认构造函数的实例是unjoinable的,使用move以后thread也会变成unjoinable。 detach之后,线程和 thread 对象将不再有任何关系,此时我们可以随意销毁thread,当然,我们也永远无法 “触碰到” 线...
detach: Detach 线程。 将当前线程对象所代表的执行实例与该线程对象分离,使得线程的执行可以单独进行。一旦线程执行完毕,它所分配的资源将会被释放。 调用detach 函数之后: *this 不再代表任何的线程执行实例。 joinable() == false get_id() == std::thread::id() 另外,如果出错或者 joinable() == false...
调用detach 函数之后: *this 不再代表任何的线程执行实例。 joinable() == false get_id() == std::thread::id() 另外,如果出错或者 joinable() == false,则会抛出 std::system_error。 #include <iostream> #include <chrono> #include <thread> ...
如果当前std::thread对象的detach()和join()被调用过了返回false. 检查当前的线程对象是否表示了一个活动的执行线程,由默认构造函数创建的线程是不能被 join 的。 另外,如果某个线程 已经执行完任务,但是没有被 join 的话,该线程依然会被认为是一个活动的执行线程,因此也是可以被 join 的。
Meyers的建议是“Make std::threads unjoinable on all paths”,也就是让std::thread在销毁时是unjoinable的。这是一种trade-off, 和之前的第一种做法一样会导致潜在的性能问题。但是相比于其他两种选择:程序被终止;detach的undefined行为,这是可以接受的(对于性能问题,可以通过实现interruptible threads来弥补)。
std::thread在销毁时,如果线程仍在运行,需要显式调用join()或detach()方法来等待或分离线程,否则会导致未定义行为或资源泄漏。 jthread在销毁时会自动等待其关联的线程结束,不需要显式调用join()或detach()方法,因此更符合 RAII 的原则,可以更方便地避免资源泄漏。
可以看到,这样创建线程是有问题的,因为在创建了线程后线程开始执行,但是主线程main()并没有停止脚步,仍然继续执行然后退出,此时线程对象还是joinable(可结合的)的,线程仍然存在但指向它的线程对象已经销毁,所以会抛出异常。 二、如何保证子线程执行完了退出后再退出主线程呢?