c++ - 安全终止 Meyers Singleton 中的线程

标签 c++ multithreading boost singleton

我有一个在 Meyers 单例中运行的 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;
};

最佳答案

几点:

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

关于c++ - 安全终止 Meyers Singleton 中的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16942602/

相关文章:

c++ - 使用 C++ 在多维 vector 中分配变量的最佳方法是什么?

c++ - 如何以跨平台的方式在 C/C++ 中测试计算机的真实一般性能?

c++ - circshift 方面的 fftshift/ifftshift

java - 暂停执行 main 方法中的循环,直到所有线程完成 Java 1.5

c++ - 在 C++ 中发送带附件的邮件? (或者如何构造可以发送到 SMTP 的 MIME 编码电子邮件消息?)

比较 volatile 数组和非 volatile 数组

java - 如何在 Spring Boot 应用程序中正确使用 ThreadPoolExecutor

c++ - 多线程——在不同类的方法之间传递变量

c++ - 编译 boost 文件系统的教程文件时遇到问题

c++ - 如何在 C++17 中不包含完整文件系统头的情况下使用文件系统的类路径?