unique_ptr with multithreading

时间:2017-06-14 17:15:25

标签: c++ multithreading thread-safety smart-pointers

我担心在没有unique_ptr的情况下使用mutex进行多线程处理。我在下面写了简化代码,请看一下。如果我检查unique_ptr != nullptr,它是否是线程安全的?

class BigClassCreatedOnce
{
public:
    std::atomic<bool> var;

    // A lot of other stuff
};

BigClassCreatedOnce类实例只会创建一次,但我不确定在线程之间使用它是否安全。

class MainClass
{
public:
    // m_bigClass used all around the class from the Main Thread

    MainClass()
        : m_bigClass()
        , m_thread()
    {
        m_thread = std::thread([this]() {
            while (1)
            {
                methodToBeCalledFromThread();
                std::this_thread::sleep_for(std::chrono::milliseconds(1));
            }
        });

        // other stuff here

        m_bigClass.reset(new BigClassCreatedOnce()); // created only once
    }

    void methodToBeCalledFromThread()
    {
        if (!m_bigClass) // As I understand this is not safe
        {
            return;
        }

        if (m_bigClass->var.load()) // As I understand this is safe
        {
            // does something
        }
    }

    std::unique_ptr<BigClassCreatedOnce> m_bigClass;
    std::thread m_thread;
};

我只是将它放入无限循环中以简化样本。

int main()
{
    MainClass ms;
    while (1)
    {
        std::this_thread::sleep_for(std::chrono::milliseconds(1));
    }
}

1 个答案:

答案 0 :(得分:2)

  

如果我检查unique_ptr != nullptr,它是否是线程安全的

不,它不是线程安全的。如果您有多个线程并且其中至少有一个线程写入共享数据,那么您需要同步。如果不这样做,那么您将遇到数据竞争,并且它是未定义的行为。

m_bigClass.reset(new BigClassCreatedOnce()); // created only once

if (!m_bigClass)

两者都可以同时发生,所以这是一场数据竞赛。

我还想指出

if (m_bigClass->var.load())

也不是线程安全的。 var.load()m_bigClass,但 preprocessors: { "**/*.component.js": ["generic"] }, 的访问权限并非如此,您也可以在那里进行数据竞争。