2014-10-06 103 views
0

我寫了3個互斥類TMutex,TCondition和TSpinLock都有一個void lock()和一個void unlock()成員。現在我想對他們使用std :: lock_guard。我instatiate在我的源文件的末尾lock_guard爲我的新的mutex類是這樣的:使用lock_guard爲自己的互斥類

template class std::lock_guard<app::TMutex>; 
template class std::lock_guard<app::TCondition>; 
template class std::lock_guard<app::TSpinLock>; 

如果我使用:

TCondition cond; 
std::lock_guard<std::mutex> lock(cond); 

我得到以下編譯器錯誤信息:

../src/inc/threads.cpp:317:39: error: no matching function for call to 'std::lock_guard::lock_guard(app::TCondition&)' ../src/inc/threads.cpp:317:39: note: candidates are: /usr/include/c++/4.6/mutex:447:7: note: std::lock_guard<_Mutex>::lock_guard(std::lock_guard<_Mutex>::mutex_type&, std::adopt_lock_t) [with _Mutex = std::mutex, std::lock_guard<_Mutex>::mutex_type = std::mutex] /usr/include/c++/4.6/mutex:447:7: note: candidate expects 2 arguments, 1 provided /usr/include/c++/4.6/mutex:444:16: note: std::lock_guard<_Mutex>::lock_guard(std::lock_guard<_Mutex>::mutex_type&) [with _Mutex = std::mutex, std::lock_guard<_Mutex>::mutex_type = std::mutex] /usr/include/c++/4.6/mutex:444:16: note: no known conversion for argument 1 from 'app::TCondition' to 'std::lock_guard::mutex_type& {aka std::mutex&}'

我還嘗試將自己的lock_guard包裝器作爲新的模板類實現(非常類似於原始的lock_guard:

template<typename T> 
class TLockGuard 
{ 
private: 
    typedef T lock_t; 
    lock_t& instance; 

public: 
    TLockGuard& operator=(const TLockGuard&) = delete; 
    explicit TLockGuard(lock_t& F) : instance(F) { instance.lock(); } 
    TLockGuard(const TLockGuard&) = delete; 
    ~TLockGuard() { instance.unlock(); } 
}; 

,並做similiar實例化這個類:

template class TLockGuard<app::TMutex>; 
template class TLockGuard<app::TCondition>; 
template class TLockGuard<app::TSpinLock>; 

如果我用這個模板類是這樣的:

TCondition cond; 
std::TLockGuard<std::mutex> lock(cond); 

我得到一個不同的錯誤:

../src/inc/threads.cpp:318:39: error: no matching function for call to 'app::TLockGuard::TLockGuard(app::TCondition&)' ../src/inc/threads.cpp:318:39: note: candidate is: ../src/inc/semaphore.h:164:12: note: app::TLockGuard::TLockGuard(app::TLockGuard::lock_t&) [with T = std::mutex, app::TLockGuard::lock_t = std::mutex] ../src/inc/semaphore.h:164:12: note: no known conversion for argument 1 from 'app::TCondition' to 'app::TLockGuard::lock_t& {aka std::mutex&}'

有人能幫助我理解在這兩種情況下出了什麼問題嗎? 我寧願使用標準的lock_guard,但如果我自己的包裝也可以工作,它會很好。

+5

'的std :: lock_guard 鎖(條件);' – dyp 2014-10-06 18:09:31

+0

@dyp後,作爲一個答案 – inf 2014-10-06 18:10:17

+0

*「我instatiate在我的源文件的末尾爲我的新lock_guard像這樣的互斥類「*我不確定你想通過顯式實例化來實現什麼。 – dyp 2014-10-06 18:12:45

回答

2

下面的例子編譯罰款:

#include <thread> 
#include <mutex> 

struct Mutex 
{ 
    void lock() {} 
    void unlock() {} 
}; 

struct Condition 
{ 
    void lock() {} 
    void unlock() {} 
}; 

struct SpinLock 
{ 
    void lock() {} 
    void unlock() {} 
}; 

template class std::lock_guard<Mutex>; 
template class std::lock_guard<Condition>; 
template class std::lock_guard<SpinLock>; 


int main() 
{ 
    static Mutex mutex; 
    std::lock_guard<Mutex> lock(mutex); 
} 

您的問題是:

TCondition cond; 
std::lock_guard<std::mutex> lock(cond); 

您正在創建期望一個的std ::互斥lock_guard但你通過了TCondition。

嘗試改變:

std::lock_guard<TCondition> lock(cond); 
+0

如果您將刪除'std :: lock_guard'的顯式模板實例,並且可能會提及它們不需要的原因,我會爲此投票。 :-) – 2014-10-06 18:31:20

+0

非常感謝提示。你不會相信我有多少次盯着這些線條;-) 它現在正在工作...... – tangram67 2014-10-06 18:37:29

+0

你並不需要顯式的模板實例化。這將有助於加快編譯速度,但我認爲你並沒有真正獲得改進。我只是刪除它 – dmayola 2017-06-08 11:05:58