0

現在、アプリケーションに次のようなboost::mutexコードセクションがあります

{//Lock
boost::unique_lock<boost::mutex> lock(some_mutex);
   while(container.empty()) 
   { 
     condition_var.wait(lock); 
   }/*Block if empty - for spurious wakeup*/ 
 ......
 ,,,,,,
}//Unlock

some_mutex は boost::mutex 型になり、 condition_var は boost::condition_variable 型になります

現在、condition_var は method でトリガーされますが、condition_var.notifyone()残念ながら、このメソッドは boost::mutex を使用して機能します。boost::mutex を削除し、CRITICAL_SECTION が提供する Windows を使用する予定です。ただし、ブースト条件は Windows CRITICAL_SECTION では機能しないと思います。上記のコードの変更を最小限に抑えて、boost::mutex を CRITICAL_SECTION に置き換えるオプションについての提案はありますか?

4

1 に答える 1

1

boost::condition_variable_anyなどの任意のミューテックスのようなオブジェクトで使用できますCRITICAL_SECTION。(DaveSのコメントによると)

ただし、速度のプロファイリングを行い、最初の単純なバージョンを次のコードと比較することを強くお勧めします。

#include <windows.h>
#include <boost/thread/condition_variable.hpp>

// wrapper class for CriticalSection
class win32cs_mutex : boost::noncopyable {
public:
  win32cs_mutex()  { ::InitializeCriticalSection(&cs_); }
  ~win32cs_mutex() { ::DeleteCriticalSection(&cs_); }
  void lock()   { ::EnterCriticalSection(&cs_); }
  void unlock() { ::LeaveCriticalSection(&cs_): }
private:
  CRITICAL_SECTION cs_;
};

win32cs_mutex some_mutex;
boost::condition_variable_any condition_var;

// client code
{
  boost::unique_lock<win32cs_mutex> lock(some_mutex);
  while(container.empty()) 
  {
    condition_var.wait(lock); 
  }
  ...
}
于 2013-07-03T11:07:43.247 に答える