2013-07-02 28 views
0

目前,我有我的應用程序一個boost ::互斥代碼段,看起來像這樣升壓條件變量等效採用CRITICAL_SECTION

{//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 ::互斥 和condition_var是一個類型爲boost :: condition_variable

現在condition_var被觸發了condition_var.notifyone()方法不幸的是這個方法需要boost :: mutex函數。 我打算刪除boost :: mutex並使用提供的CRITICAL_SECTION提供的窗口。不過,我相信升壓條件不適用於Windows CRITICAL_SECTION 任何建議我的選擇可能是用CRITICAL_SECTION替換boost :: mutex並用上面代碼中的最小改變?

+1

您需要包裹CRITICAL_SECTION代碼提供鎖定/解鎖方法的類,然後你可以用'提振:: condition_variable_any',它接受它實現了可鎖定概念的任何類。 –

+0

你爲什麼打算更換? boost :: mutex在功能上等同於CRITICAL_SECTION。 – yohjp

+0

由於速度。 – Rajeshwar

回答

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); 
    } 
    ... 
}