C++ 为自己的互斥类使用锁保护
我已经编写了3个互斥类TMutex、TCondition和TSpinLock,它们都有一个void lock()和一个void unlock()成员。现在我想对它们使用std::lock\u-guard。我在源文件末尾为我的新互斥类安装了lock_guard,如下所示:C++ 为自己的互斥类使用锁保护,c++,multithreading,c++11,C++,Multithreading,C++11,我已经编写了3个互斥类TMutex、TCondition和TSpinLock,它们都有一个void lock()和一个void unlock()成员。现在我想对它们使用std::lock\u-guard。我在源文件末尾为我的新互斥类安装了lock_guard,如下所示: template class std::lock_guard<app::TMutex>; template class std::lock_guard<app::TCondition>; template
template class std::lock_guard<app::TMutex>;
template class std::lock_guard<app::TCondition>;
template class std::lock_guard<app::TSpinLock>;
TCondition cond;
std::TLockGuard<std::mutex> lock(cond);
模板类std::lock\u guard;
模板类std::锁紧装置;
模板类std::锁紧装置;
如果我使用:
TCondition cond;
std::lock_guard<std::mutex> lock(cond);
t条件条件;
标准:锁和防护锁(cond);
我收到以下编译器错误消息:
../src/inc/threads.cpp:317:39:错误:调用“std::lock\u guard::lock\u guard(app::t条件&)”时没有匹配的函数
../src/inc/threads.cpp:317:39:注意:候选项包括:
/usr/include/c++/4.6/mutex:447:7:注:std::lock\u guard::lock\u guard::mutex\u type&,std::adopt\u lock\u t)[与_mutex=std::mutex,std::lock\u guard::mutex\u type=std::mutex]
/usr/include/c++/4.6/mutex:447:7:注意:候选者需要2个参数,提供1个
/usr/include/c++/4.6/mutex:444:16:注意:std::lock\u-guard::lock\u-guard::mutex\u-type&[带_-mutex=std::mutex,std::lock\u-guard::mutex\u-type=std::mutex]
/usr/include/c++/4.6/mutex:444:16:注意:参数1从'app::TCondition'到'std::lock\u guard::mutex\u type&{aka std::mutex&}没有已知的转换
我还尝试将自己的锁保护包装器实现为一个新的模板类(非常类似于原始的锁保护:
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(); }
};
模板
类锁紧装置
{
私人:
typedef T lock_T;
锁&实例;
公众:
TLockGuard&运算符=(const TLockGuard&)=删除;
显式TLockGuard(lock_t&F):实例(F){instance.lock();}
TLockGuard(const TLockGuard&)=删除;
~TLockGuard(){instance.unlock();}
};
并对此类执行类似的实例化:
template class TLockGuard<app::TMutex>;
template class TLockGuard<app::TCondition>;
template class TLockGuard<app::TSpinLock>;
模板类TLockGuard;
模板类TLockGuard;
模板类TLockGuard;
如果我像这样使用这个模板类:
template class std::lock_guard<app::TMutex>;
template class std::lock_guard<app::TCondition>;
template class std::lock_guard<app::TSpinLock>;
TCondition cond;
std::TLockGuard<std::mutex> lock(cond);
t条件条件;
标准::t锁紧装置锁(cond);
我得到一个不同的错误:
../src/inc/threads.cpp:318:39:错误:调用“app::TLockGuard::TLockGuard(app::TCondition&)”时没有匹配的函数
../src/inc/threads.cpp:318:39:注意:候选对象是:
../src/inc/semaphore.h:164:12:注意:app::TLockGuard::TLockGuard(app::TLockGuard::lock\u t&)[带t=std::mutex,app::TLockGuard::lock\u t=std::mutex]
../src/inc/semaphore.h:164:12:注意:参数1从'app::TCondition'到'app::TLockGuard::lock\t&{aka std::mutex&}的转换未知
有人能帮我理解这两种情况下都出了什么问题吗?
我更喜欢使用标准的lock_-guard,但如果我自己的包装器也能工作,那就太好了。下面的示例编译得很好:
#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);
}
#包括
#包括
结构互斥
{
无效锁(){}
void unlock(){}
};
结构条件
{
无效锁(){}
void unlock(){}
};
结构自旋锁
{
无效锁(){}
void unlock(){}
};
模板类std::锁紧装置;
模板类std::锁紧装置;
模板类std::锁紧装置;
int main()
{
静态互斥;
std::锁和保护锁(互斥锁);
}
你的问题是:
TCondition cond;
std::lock_guard<std::mutex> lock(cond);
t条件条件;
标准:锁和防护锁(cond);
您正在创建一个需要std::mutex但传递了一个TCondition的锁保护
尝试更改为:
std::lock_guard<TCondition> lock(cond);
std::锁和防护锁(cond);
std::lock\u guard lock(cond);
@dyp发布这样一个回答:“我在源文件末尾为我的新互斥类安装了lock\u guard,如下所示”我不确定您试图通过显式实例化实现什么。如果您删除std::lock\u guard
的显式模板实例化,并可能提及不需要它们的原因,我将对此进行投票。:-)非常感谢您的提示。你不会相信我盯着这些线看了多少次;-)它现在可以工作了……您实际上不需要显式的模板实例化。这将有助于加快编译速度,但我认为您并没有因此得到真正的改进。我会把它拿走