c++ - 如何使用 boost::call_once 在 Linux 上用 C++ 设计单例类?

标签 c++ linux multithreading boost singleton

我正在使用 boost::call_once 在 Linux 上使用 C++ 设计一个线程安全的单例类。

我得到以下编译器错误:

/tmp/ccLanvZI.o: In function `SingleTon::getInstance()':
singleTon.cpp:(.text._ZN9SingleTon11getInstanceEv[SingleTon::getInstance()]+0x1b): undefined reference to `SingleTon::p'
/tmp/ccLanvZI.o: In function `SingleTon::makeInstance()':
singleTon.cpp:(.text._ZN9SingleTon12makeInstanceEv[SingleTon::makeInstance()]+0x21): undefined reference to `SingleTon::SingleTon()'
singleTon.cpp:(.text._ZN9SingleTon12makeInstanceEv[SingleTon::makeInstance()]+0x2c): undefined reference to `SingleTon::p'
collect2: ld returned 1 exit status
make: *** [singlton] Error 1

看了一些帖子,还是不知道怎么处理这个错误。 如何将 void (SingleTon::)() 更改为 void (*)()


#include <iostream>
#include <pthread.h>
#include <boost/thread/mutex.hpp>
#include <boost/thread/once.hpp>
#include <boost/bind.hpp>
#include <boost/threadpool.hpp>
#include <boost/thread/thread.hpp>

boost::once_flag flag = BOOST_ONCE_INIT;

class SingleTon
{
    private:
        static SingleTon *p;
        SingleTon();
        SingleTon(const SingleTon&);
        SingleTon& operator=(const SingleTon&);
        void makeInstance();

    public:
        SingleTon* getInstance();

        ~SingleTon()
        {
            if (p)
                delete p;
        }  
};

void SingleTon::makeInstance() 
{
    p = new SingleTon;
    return;
}

SingleTon* SingleTon::getInstance()
{
    boost::call_once( makeInstance  , flag); // error !!!
    return p;
}


int main()
{
    SingleTon *s;
    s = SingleTon::getInstance();
    return 0;
}

最佳答案

错误表明 boost::call_once 对成员函数指针不起作用。这是因为您忘记将 makeInstance 和 getInstance 设为静态。

关于c++ - 如何使用 boost::call_once 在 Linux 上用 C++ 设计单例类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10777520/

相关文章:

c++ - 用qt制作C++库

c++ - 在控制台应用程序中使用 ocx

php - Windows telnet 给出不同的结果

c# - Task.Wait 与 Task.RunSyncronously 其中任务调用了 WPF Dispatcher.Invoke

multithreading - 如何在不复制所有变量的情况下制作 perl 线程?

c++ - 函数模板参数的类型推导

c++ - 如何在wxTextctrl中实现字符限制

linux - 如何将 Linux which 命令的输出通过管道传输到 Linux 文件命令中?

c linux 检查文件是否更新/更改/修改?

java - 如何在运行时更新 ThreadPoolExecutor 线程池大小