在Meyers Singleton中安全地终止一个帖子

时间:2013-06-05 14:28:26

标签: c++ multithreading boost singleton

我在Meyers的Singleton中运行了一个提升线程。它很愉快地运行我的程序期间。

当调用我的Singleton的析构函数时(当程序加载内存不足时)我设置一个标志,以便线程退出它的循环并触发对thread.join()的调用。

现在,在Windows上,调用thread.join()会导致错误的访问异常。但是在Mac上, 调用thread.join()会引发错误的访问异常!

任何人都可以了解这两个操作系统之间的行为差​​异,并且/或者提供有关如何安全终止我的线程的说明吗?

编辑:如果我在一个简单的命令行应用程序中运行它,此代码适用于Mac和Windows。我打电话给myThread.join()是不是没关系!

作为共享库运行会出现问题...当我尝试再次重新加载dylib并且忽略对myThread.join()的调用时,Mac上出现内存异常,

示例:

#include "boost/thread.hpp"

class MeyersSingleton
{
public:
    MeyersSingleton()
    :   threadShouldExit(false),
        myThread(boost::ref(*this) ) {
    }

    ~MeyersSingleton() {
        threadShouldExit = true;
        myThread.join();
    }

    static MeyersSingleton& getInstance() {
        static MeyersSingleton singletonInstance;
        return singletonInstance;
    }

    void operator()() {
        while(!threadShouldExit) {
            // my busy worker thread...
            sleep(1);
        }
    }
private:
    bool threadShouldExit;
    boost::thread myThread;
};

1 个答案:

答案 0 :(得分:0)

几点:

  • sleep()在多线程应用程序中不安全,因为它使用SIGALRM。请改用nanosleep()
  • threadShouldExit在没有锁定的情况下被更改,因此它应该是C ++ 11原子,或使用atomic functions来读取和设置其值。