首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >安全终止Meyers Singleton中的线程

安全终止Meyers Singleton中的线程
EN

Stack Overflow用户
提问于 2013-06-05 14:28:25
回答 1查看 237关注 0票数 2

我在Meyers‘Singleton里面有一个助推线程。它愉快地运行在我的程序期间。

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

现在,在Windows上,调用thread.join()会导致错误的访问异常。但是在Mac上,而不是调用thread.join()会抛出一个糟糕的访问异常!

有人能解释一下这两个操作系统之间的行为差异,或者提供如何安全终止我的线程的指导吗?

编辑:如果我在一个简单的命令行应用程序中运行它,这段代码可以在Mac和Windows上运行。我打不打给myThread.join() 并不重要!

作为共享库运行显示了这个问题..。当我第二次尝试重新加载dylib并省略对myThread.join()的调用时,Mac上的内存异常就会发生,

示例:

代码语言:javascript
复制
#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;
};
EN

回答 1

Stack Overflow用户

发布于 2013-09-16 11:22:50

以下几点:

  • sleep()在多线程应用程序中不安全,因为它使用SIGALRM。使用nanosleep()代替。
  • threadShouldExit被更改时没有锁,所以它应该是一个C++11原子,或者使用原子函数来读取和设置它的值。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16942602

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档