c++ - 对自己的互斥锁类使用lock_guard

标签 c++ multithreading c++11

我写了3个互斥体类TMutex、TCondition和TSpinLock,它们都有一个void lock()和一个void unlock()成员。现在我想对它们使用 std::lock_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::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(); }
};

并对此类进行类似的实例化:

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,但如果我自己的包装器也能工作那就太好了。

最佳答案

以下示例可以正常编译:

#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::mutex 的 lock_guard,但您传递了一个 TCondition。

尝试更改为:

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

关于c++ - 对自己的互斥锁类使用lock_guard,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26221978/

相关文章:

c++ - 插入和合并排序不适用于大数据集 C++

java - java中的静态同步方法有什么用?

java - 当AsyncTasks满了会发生什么?

c++ - 具有 C++11 构造的映射函数

c++ - C++ 中的垃圾收集——为什么?

C++ 代码在 VS2010 中工作但在 2013 中不工作

c++ - 如何确保成员是 4 字节对齐的?

c++ - 在 IF 条件下替代多次检查

c++ - 抽象基类(成员变量)的 shared_ptr 是一个未声明的标识符

java - 根据 Callable 的某些属性选择 ThreadPool 线程