繁体   English   中英

安全地终止Meyers Singleton中的线程

[英]safely terminating a thread in Meyers Singleton

我在Meyers'Singleton内部运行了一个Boost线程。 在我的程序运行期间,它会愉快地运行。

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

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

谁能阐明这两个操作系统之间的行为差​​异,并且/或者提供有关如何安全终止我的线程的说明?

编辑:如果我在简单的命令行应用程序中运行此代码,则该代码在Mac和Windows上均适用。 是否调用myThread.join()没有关系!

当以共享库的形式运行时会出现问题...在Mac上发生内存异常,是在我尝试第二次重新加载dylib并忽略对myThread.join()的调用时myThread.join()

例:

#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;
};

要点:

  • sleep()在多线程应用程序中并不安全,因为它使用SIGALRM 使用nanosleep()代替。
  • threadShouldExit更改时不持有任何锁,因此它应该是C ++ 11原子的,或者使用原子的函数读取和设置其值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM