блоки std :: thread в синглтоне и .dll

0

Я много читал об этом, но пока не нашел решения.

Моя проблема в том, что когда я пытаюсь это сделать, я теряю контроль.

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

Я работаю с классом, реализующим одноэлементный шаблон в многопоточной среде. Мой проект скомпилирован в библиотеку DLL. Все работает отлично, кроме создания потоков.

Я пробовал это (ссылка), и этот пример отлично работает в автономном консольном приложении, но мой проект работает как библиотека DLL.

Когда я загружаю его из других 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();
        }
    }
}

Любая идея, почему это не работает?

Теги:
dll
multithreading
thread-safety
stdthread

1 ответ

2
Лучший ответ

Я думаю, что это связано с тем, что вы пытаетесь создать поток из DllMain, см. Также:

Создание потока в DllMain?

  • 0
    Спасибо большое. Да, я вызываю PlayerClientSingleton :: instance () -> initialize (); от DLL_PROCESS_ATTACH, но это то, что я ожидал сделать. Я ищу альтернативу ... но не легко ...
  • 0
    Я бы предложил вызвать PlayerClientSingleton :: initialize явно из кода с использованием вашей dll.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню