c++ - C++中互斥锁的单例类

标签 c++ multithreading c++11 mutex

我正在努力让它工作,但似乎有一些我不完全理解的东西。

我在单个文件中有一个多线程应用程序(2 个类和真正的主程序,我在其中创建线程和所有内容)。我想分成 3 个文件。一个用于每个类(带有它们的标题),一个用于 main。

我有几个 mutices 和一个队列来在线程之间共享消息并随时锁定和解锁它们。

我想写一个单例类,这样所有类都可以共享互斥量:

标题:

#ifndef COMMONSINGLETON_H
#define COMMONSINGLETON_H

#include <mutex>          // std::mutex
#include <queue>

class CommonSingleton{
    private:
        static std::mutex               mutex_w_b;
        //static std::mutex               mutex_wifi_ok;
        //static std::queue <std::string> queue_w_b;

    public:
        static CommonSingleton& getInstance();
        std::mutex GetMutexWB();
        //std::mutex GetMutexWiFiOk();
        //std::queue <std::string> GetQueueWB();
    private:
        CommonSingleton() {};
        CommonSingleton(CommonSingleton const&);
        void operator=(CommonSingleton const&);
};
#endif

还有我的 .cpp 文件:

#include "commonsingleton.h"

static CommonSingleton& CommonSingleton::getInstance(){
    static CommonSingleton instance;
    return instance;
}
std::mutex CommonSingleton::GetMutexWB(){
    return mutex_w_b;
}
/*std::mutex CommonSingleton::GetMutexWiFiOk(){
    return mutex_wifi_ok;
}
std::queue <std::string> CommonSingleton::GetQueueWB(){
   return queue_w_b;
}*/

在我的主要我有这个来测试互斥锁:

CommonSingleton::getInstance().GetMutexWB.lock();

不过现在评论出来了,就是为了搞清楚怎么编译。这是我得到的错误:

commonsingleton.cpp:4:54: error: cannot declare member function ‘static 
CommonSingleton& CommonSingleton::getInstance()’ to have static linkage [-
fpermissive]
static CommonSingleton& CommonSingleton::getInstance(){
                                                  ^
commonsingleton.cpp: In member function ‘std::mutex 
CommonSingleton::GetMutexWB()’:
commonsingleton.cpp:9:12: error: use of deleted function 
‘std::mutex::mutex(const std::mutex&)’
return mutex_w_b;
            ^
In file included from commonsingleton.h:5:0,
from commonsingleton.cpp:1:
/usr/include/c++/4.8/mutex:128:5: error: declared here
mutex(const mutex&) = delete;

我在这里做错了什么?

最佳答案

您不需要那么多样板文件。你只需要一个函数:

std::mutex& getCommonMutex() {
    static std::mutex m;
    return m;
}

就是这样,你可以从任何地方调用这个函数,它总是会返回对同一个互斥锁的引用,它会在第一次调用时被初始化。

关于c++ - C++中互斥锁的单例类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43758430/

相关文章:

c++ - MFC - 打印 - 从自定义页面设置对话框更改页面方向

c# - WebBrowser.Print() 的线程

java - 为什么我的消费者不消费整数值? (具有等待和通知的生产者-消费者)

c++ - 如何测试 decltype 的可用性?

c++ - 如果您始终将其存储在 shared_ptr 中,您的接口(interface)是否需要虚拟析构函数?

c++ - 需要帮助理解 Java 人员的 C++ Windows

c# - 添加通过引用传递字符串的 Mono 内部调用

类对象的 C++ vector 文件\回到程序

c++ - 原子操作传播/可见性(原子负载与原子 RMW 负载)

c++ - std::bind() 错误:无法确定重载函数 "boost::asio::io_service::run"的实例