通过多个线程取消引用指针

Dereferencing a pointer by multiple threads

提问人:Vero 提问时间:12/10/2022 最后编辑:Vero 更新时间:12/10/2022 访问量:117

问:

在下面的示例中,假设我有一个多线程队列,即支持来自不同线程的多次写入和读取(例如使用互斥锁)。我们可以看到 1.指针以及 2.共享指针传递给读者和作者,我的问题是:取消引用指针,线程是否安全?换句话说,我的以下代码线程是否安全,这意味着如果我运行它,我是否应该担心任何未定义的行为?thism_mulquethism_mulque

#include <mutex>
#include <queue>

struct multithreaded_queue
{
    void push(const std::size_t i) 
    {
        std::lock_guard lock(m_mutex);
        m_queue.push(i);
    };

    void try_pop() 
    {
        std::lock_guard lock(m_mutex);
        m_queue.pop();
    };

private:
    std::queue<std::size_t> m_queue;
    mutable std::mutex m_mutex;
};
class example
{
public:
    example()
    {
        m_mulque = std::make_shared<multithreaded_queue>();
    };

    void run()
    {
        auto writer = [this]()
        {
            for (std::size_t i = 0; i < 1000; i++)
            {
                m_mulque->push(i);
            };
        };

        auto reader = [this]()
        {
            for (std::size_t i = 0; i < 1000; i++)
            {
                m_mulque->try_pop();
            };
        };

        std::thread writer1(writer);
        std::thread reader1(reader);
        std::thread reader2(reader);

        writer1.join();
        reader1.join();
        reader2.join();
    };

private:
    std::shared_ptr<multithreaded_queue> m_mulque;
};
int main(int argc, char* argv[])
{
    example ex;
    ex.run(); //Is this thread safe to call?
};
C++ 多线程 这个 智能指针

评论

1赞 user253751 12/10/2022
您认为这不应该是线程安全的吗?
1赞 Thomas Weller 12/10/2022
既然你从不改变这一点,也从不改变m_mulque,我会说这很好,因为multithreaded_queue是正确实现的。
0赞 Vero 12/10/2022
@user253751我同意你的看法,只是想确定一下。我没有找到 cpp 参考,即取消引用是线程安全的。我发现柜台是。
1赞 Drew Dormann 12/10/2022
取消引用既不是线程安全的,也不是线程不安全的。取消引用读取是线程安全的。取消引用写入可能不安全。
1赞 Richard Critten 12/10/2022
m_mulque在两个线程启动之前创建。开始 a 是一个同步点。从多个线程读取(取消引用)始终是安全的。只有当代码至少有 1 个写入器和另一个读取器/写入器时,这才是一个潜在的问题std::threadm_mulque

答: 暂无答案