Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为自己的互斥类使用锁保护_C++_Multithreading_C++11 - Fatal编程技术网

C++ 为自己的互斥类使用锁保护

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

我已经编写了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 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
的显式模板实例化,并可能提及不需要它们的原因,我将对此进行投票。:-)非常感谢您的提示。你不会相信我盯着这些线看了多少次;-)它现在可以工作了……您实际上不需要显式的模板实例化。这将有助于加快编译速度,但我认为您并没有因此得到真正的改进。我会把它拿走