shared_ptr修改操作是原子的吗?

时间:2017-10-03 14:59:45

标签: c++ multithreading shared-ptr

我的应用程序保留一个全局共享指针,多个线程在被另一个线程更改时从该共享指针获取副本?

这样安全吗?那么这样做的正确方法是什么?

代码:

#include <iostream>
#include <memory>
#include <thread>

class Configuration
{
public:
    Configuration(uint64_t value) { m_value = value; }
    virtual ~Configuration() {}
    uint64_t getValue() const { return m_value; }
private:
    uint64_t m_value;
};

std::shared_ptr<Configuration> g_configuration = nullptr;

void outputProcessing()
{
    uint64_t sum = 0;
    while (true)
    {
        auto configuration = g_configuration;
        sum += configuration->getValue();
    }
}

void inputProcessing()
{
    uint64_t value = 1;
    while (true)
    {
        auto configuration = std::make_shared<Configuration>(value++);
        g_configuration = configuration;
    }
}

int main(const int argc, const char** argv)
{
    g_configuration = std::make_shared<Configuration>(0);

    std::thread inputThread(inputProcessing);

    std::thread outputThread1(outputProcessing);
    std::thread outputThread2(outputProcessing);
    std::thread outputThread3(outputProcessing);

    inputThread.join();

    outputThread1.join();
    outputThread2.join();
    outputThread3.join();

    return EXIT_SUCCESS;
}

在这个应用程序中,一个线程创建新的共享指针并分配给其他线程正在复制的全局指针。

如果这不是线程安全的,那么选项是什么?

请忘记输出线程中实现的实际功能。

0 个答案:

没有答案