为什么在全局变量的析构函数中调用thread.join失败

埃米尔

我将有问题的代码简化为以下内容。我有一个在其自己的线程上运行成员函数的C类。在CI的析构函数中要彻底退出此线程。只要在main(1)中定义了c,它就可以正常工作,但是当它是全局变量(2)时则不能。在后一种情况下,我看到线程函数返回了,但是t.join()挂起了。

#include <mutex>
#include <condition_variable>
#include <thread>
#include <iostream>

using namespace std;

class C
{
public:
    C()
    {
        stop = false;
        t = thread(&C::ThreadFunc, this);
    }
    ~C()
    {
        stop = true;
        cv.notify_all();
        if (t.joinable())
        {
            cout << "joining" << endl;
            t.join();
            cout << "joined" << endl;
        }
    }

private:
    void ThreadFunc()
    {
        while (true)
        {
            unique_lock<mutex> lock(m);
            cv.wait(lock, [&]{return stop;});
            cout << "returning" << endl;
            return;
        }
    }

    thread t;
    mutex m;
    condition_variable cv;
    bool stop;
};

C c;  // does *not* work (2)

int _tmain(int argc, _TCHAR* argv[])
{
    C c;  // does work (1)
    return 0;
}

我使用全局变量的原因是它实际上是dll的一部分。当从DLL_PROCESS_DETACH上的DllMain触发析构函数时,会发生相同的问题。是否有对此问题的解释和解决方案?

大卫·施瓦兹

这是一个僵局。您持有的锁t要求在等待终止时t终止。

说,作为t的分离过程的一部分,它将对DLL进行一些调用。当存在join部分连接到该线程的线程(称为的线程时,DLL如何合理地处理请求一旦开始分离,直到分离完成,DLL就会处于不一致状态,并且无法明智地处理线程附加和分离操作。

您真的不想在进程无法控制的上下文中尝试加入线程。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在全局var析构函数中调用时thread.join不返回

来自分类Dev

cuda调用在析构函数中失败

来自分类Dev

cuda调用在析构函数中失败

来自分类Dev

在全局变量的析构函数中初始化thread_local变量合法吗?

来自分类Dev

Bash 函数全局变量失败

来自分类Dev

创建实例失败时调用的析构函数?

来自分类Dev

为什么在Friend函数中调用析构函数

来自分类Dev

瓦拉:通过处理程序ID与类析构函数断开信号处理程序失败-为什么?

来自分类Dev

全局变量定义失败

来自分类Dev

使用匿名类型时,对“ Join”的调用中的类型推断失败

来自分类Dev

dlclose上未调用共享库中全局静态变量的析构函数

来自分类Dev

为什么全局变量会对函数调用中的编译器优化造成麻烦?

来自分类Dev

为什么析构函数比构造函数调用得更多?

来自分类Dev

全局变量构造函数/析构函数是否需要线程保护?

来自分类Dev

为什么在使用赋值时不调用析构函数的堆栈变量?

来自分类Dev

rst2html.py打印“在文件对象析构函数中关闭失败”

来自分类Dev

rst2html.py打印“在文件对象析构函数中关闭失败”

来自分类Dev

为什么我的类析构函数立即被调用?

来自分类Dev

为什么调用从对象移出的析构函数?

来自分类Dev

为什么emplace_back调用析构函数?

来自分类Dev

为什么在构造时调用C ++类的析构函数?

来自分类Dev

为什么析构函数被调用三次?

来自分类Dev

为什么在std :: move之后需要析构函数调用?

来自分类Dev

为什么析构函数被调用两次?

来自分类Dev

为什么析构函数调用两次表单?

来自分类Dev

为什么不调用继承类的析构函数?

来自分类Dev

为什么代码两次调用析构函数?

来自分类Dev

为什么在构造时调用C ++类的析构函数?

来自分类Dev

为什么我的类析构函数立即被调用?

Related 相关文章

  1. 1

    在全局var析构函数中调用时thread.join不返回

  2. 2

    cuda调用在析构函数中失败

  3. 3

    cuda调用在析构函数中失败

  4. 4

    在全局变量的析构函数中初始化thread_local变量合法吗?

  5. 5

    Bash 函数全局变量失败

  6. 6

    创建实例失败时调用的析构函数?

  7. 7

    为什么在Friend函数中调用析构函数

  8. 8

    瓦拉:通过处理程序ID与类析构函数断开信号处理程序失败-为什么?

  9. 9

    全局变量定义失败

  10. 10

    使用匿名类型时,对“ Join”的调用中的类型推断失败

  11. 11

    dlclose上未调用共享库中全局静态变量的析构函数

  12. 12

    为什么全局变量会对函数调用中的编译器优化造成麻烦?

  13. 13

    为什么析构函数比构造函数调用得更多?

  14. 14

    全局变量构造函数/析构函数是否需要线程保护?

  15. 15

    为什么在使用赋值时不调用析构函数的堆栈变量?

  16. 16

    rst2html.py打印“在文件对象析构函数中关闭失败”

  17. 17

    rst2html.py打印“在文件对象析构函数中关闭失败”

  18. 18

    为什么我的类析构函数立即被调用?

  19. 19

    为什么调用从对象移出的析构函数?

  20. 20

    为什么emplace_back调用析构函数?

  21. 21

    为什么在构造时调用C ++类的析构函数?

  22. 22

    为什么析构函数被调用三次?

  23. 23

    为什么在std :: move之后需要析构函数调用?

  24. 24

    为什么析构函数被调用两次?

  25. 25

    为什么析构函数调用两次表单?

  26. 26

    为什么不调用继承类的析构函数?

  27. 27

    为什么代码两次调用析构函数?

  28. 28

    为什么在构造时调用C ++类的析构函数?

  29. 29

    为什么我的类析构函数立即被调用?

热门标签

归档