У меня есть 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: То, что я пытаюсь сделать, может показаться запутанным, однако приведенное здесь описание является упрощенной версией моего точного варианта использования. Поэтому, пожалуйста, потерпите меня на этом фронте.