2

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

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

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

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

编辑:如果我在一个简单的命令行应用程序中运行此代码,它可以在 Mac 和 Windows 上运行。打不打都无所谓myThread.join()

作为共享库运行会出现问题......当我第二次尝试重新加载 dylib 并且我省略了对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;
};
4

1 回答 1

0

几点:

  • sleep()在多线程应用程序中是不安全的,因为它使用SIGALRM. 改为使用nanosleep()
  • threadShouldExit更改时没有持有锁,因此它应该是 C++11 原子,或者使用原子函数来读取和设置它的值。
于 2013-09-16T11:22:50.347 回答