std :: thread在单例和.dll中阻塞

时间:2014-06-03 10:26:35

标签: c++ multithreading dll thread-safety stdthread

我已经阅读了很多相关内容,但我还没有找到任何解决方案。

我的问题是,当我尝试这样做时,我失控了。

hiloEscucha = std::thread(&PlayerClientSingleton::Run, this);

我正在使用在多线程环境中实现单例模式的类。我的项目被编译为DLL库。除了创建线程外,一切正常。

我已经尝试了这个(link),这个示例在一个独立的控制台应用程序中工作正常,但我的项目作为DLL库运行。

当我从其他C ++和C#项目加载它时它工作正常,并且当调用其他方法时它也运行良好。当我拨打std::thread时会出现问题。

以下是我的代码中最重要的部分:

class PlayerClientSingleton : public PlayerClient {
public:
    static PlayerClientSingleton* instance(void) {
        std::call_once(m_onceFlag, [] { m_instance = new PlayerClientSingleton; });
        return m_instance;
    }

    //Initialize is called from the .dll initialization (Dllmain)
    bool initialize(void) { 
        runThread();
    }

    void runThread(void) {
        m_thread = std::thread(&PlayerClientSingleton::Run, this);

        if (m_thread.joinable()) {
            m_thread.detach();
        }
    }

    static PlayerClientSingleton* m_instance;
    static std::once_flag         m_onceFlag;
    std::thread                   m_thread;
}

class PlayerClient {
protected:
    virtual void Run() {
        while (!m_threadEdn) {
            doSomething();
        }
    }
}

知道为什么它不起作用?

1 个答案:

答案 0 :(得分:2)

我认为这与您尝试从DllMain创建线程的事实有关,另请参阅:

Creating a thread in DllMain?