プロジェクトを msvc110 を使用して C++11 標準に移行中ですが、残念ながら、dll で使用されるスレッド変数が、以前のブースト バージョンとは異なる動作をしています。
したがって、もともとこれは msvc90 で機能していました。基本的に、Dll はスレッドが作成された InitDll を呼び出します。スレッドは基本的に、dll のメイン スレッドと共にリスナーとして機能しました。スレッドを作成すると、ハングして何もせず、スレッドの初期化に使用された関数を実行することさえできません。
ブースト バージョンと同じ動作を得るにはどうすればよいか、説明を手伝っていただけませんか?
編集:コード
申し訳ありませんが、コメントのコードに返信できませんでした
アプリケーションは、dll を介してロガーを使用します。非常に単純なコンソール アプリケーションでロガーを使用するには、次のようにします。
#include <Somewhere/Logger.h>
int main()
{
COOL_LOGGER("Here we go logging on console!");
return 0;
}
コードの記述方法については議論できますが (前述のデモから引用)、dll とスレッドを初期化する方法は次のとおりです。
#include "Logger.h"
#ifdef _WIN32
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
TheLog::InitLog();
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
#endif
#include <thread>
void InitLog()
{
// Do the init taken from library demos
std::thread m_thread(LogListener);
}
void LogListener()
{
while(!bAppEnd)
{
std::cin>>str;
// change log behavior according to the user input
}
}
// to stop the thread when shutting down
void EndLog()
{
// retrieve thread thought id or some other way
thread.join();
}