Выход потока в dll, динамически связанном во время выполнения - PullRequest
0 голосов
/ 07 мая 2018

У меня есть DLL, в которой у меня есть класс, в конструкторе которого я запускаю std :: thread. Std :: thread присоединяется к деструктору класса. Объект этого класса может быть создан либо напрямую, либо с помощью экспортированного метода GetObject.

В моем приложении, когда я делаю привязку времени загрузки к dll и создаю статический объект класса в dll (вне main), поток завершается правильно. Инициализация выполняется за пределами главной, как это:

static Threader thr;

Однако, если я сделаю ссылку во время выполнения на dll и создаю объект с помощью метода GetObject, на этот раз обернутый внутри статического объекта (снова вне main). Поток завершается до уничтожения объекта. Инициализация выполняется вне основного, например:

Threader * thread = nullptr;
struct Setup
{
    Setup()
    {
        HINSTANCE threader = LoadLibrary(L"ThreadInDll.dll");

        typedef Threader& (*PFUN)(void);
        PFUN th = (PFUN)GetProcAddress(threader, "GetObject");
        thread = th ? &((*th)()) : nullptr;
    }
};
static Setup firstThing;

Я использую VS2015 для Windows.

Я наблюдаю завершение потока в окне вывода, печатая идентификатор потока, запущенного внутри dll, и затем сравнивая "Нить xxxx вышла с кодом 0 (0x0)" сообщений в окне вывода.

Также в деструкторе объекта dll я могу присоединиться к потоку даже после того, как он был прерван в вышеуказанном случае.

P.S: То, что я пытаюсь сделать, может показаться запутанным, однако приведенное здесь описание является упрощенной версией моего точного варианта использования. Поэтому, пожалуйста, потерпите меня на этом фронте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...