2017-08-11 2 views
3

boost :: dll :: shared_libraryを使用して読み込まれたDLL内でBoost-Deadlinetimerを使用しようとしています。以下のコードスニペットは、本質的に縮小されています。Windows DLLでboost :: asio :: deadline_timerを使用中にデッドロックが発生する

Example.h:

#include <boost/asio.hpp> 
class Example 
{ 
public: 
    Class() : m_timer(m_ioService) { } 
    virtual ~Class() { } 
    //...  
private: 
    boost::asio::io_service m_ioService; 
    boost::asio::deadline_timer m_timer; 
    //... 
}; 

Example.cpp:

#include "Example.h" 
#include <boost/config.hpp> 
//... 
extern "C" BOOST_SYMBOL_EXPORT Example MyExample; 
Example MyExample; 

MAIN.CPP:

#include <boost/dll/Import.hpp> 
//... 
boost::dll::shared_library lib("Example.dll", boost::dll::load_mode::Default_mode); 
//... 

私の問題は、コンパイルされたDLLをロード中にデッドロックがあるということですコンストラクタの初期化リストにm_timerが含まれている限りです。

boost::shared_ptrによってm_timerを交換し、コンストラクタ(または後続の関数)でそれを初期化し、ないデッドロックローディング DLLが、デッドロックがながらをアンロードしながら、DLLがあります。

とにかく、私は実際には、Windows dllでグローバルデッドラインタイマーオブジェクトを使用することはできません。

答えて

2

Windowsには、の呼び出しから返されるまで保持されているLoaderLockがあります。

このロックは、カスケードされたDLLが適切に参照カウントされるため、プロセスが安定していることを確実にするためにWindowsシステムによって使用されます。

DLL内で作成されたグローバルは、DllMainが実行される直前にdynamic initializationによって構築され、DllMainの終了直後に破棄されます(DLL_PROCESS_DETACH)。ロックの使用

あなたはグローバル変数とのDLLを作成する場合は、あなたがリンクでルールに従うと、避ける必要が...

  • ロードのDLL
  • - ロック反転
  • の原因レジストリ
  • StringType機能を使用してスレッド
  • を破壊する/作成を読む
  • 作成プロセス

これに対処する最も簡単な方法は、LoadLibraryの後に呼び出される個別の初期化関数と、グローバル変数が個別に初期化される最終のFreeLibraryの前に呼び出されるUninitialize関数です。

関連する問題