【问题标题】:safely terminating a thread in Meyers Singleton安全终止 Meyers Singleton 中的线程
【发布时间】:2013-06-05 14:28:25
【问题描述】:

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

当我的 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;
};

【问题讨论】:

  • 为了完整起见,Linux 中发生了什么? :D
  • 差异很可能是由于您的代码中未定义的行为。
  • 我们需要看代码。
  • 静态对象的破坏顺序可能是未定义行为的根源。
  • 如果您有一个简单的命令行应用程序,请将其包含在您的问题中,因为目前写的不是sscce

标签: c++ multithreading boost singleton


【解决方案1】:

几点:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-12
    • 1970-01-01
    • 2016-03-04
    • 1970-01-01
    相关资源
    最近更新 更多