提问人:Vero 提问时间:12/10/2022 最后编辑:Vero 更新时间:12/10/2022 访问量:117
通过多个线程取消引用指针
Dereferencing a pointer by multiple threads
问:
在下面的示例中,假设我有一个多线程队列,即支持来自不同线程的多次写入和读取(例如使用互斥锁)。我们可以看到 1.指针以及 2.共享指针传递给读者和作者,我的问题是:取消引用指针,线程是否安全?换句话说,我的以下代码线程是否安全,这意味着如果我运行它,我是否应该担心任何未定义的行为?this
m_mulque
this
m_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?
};
答: 暂无答案
评论
m_mulque
在两个线程启动之前创建。开始 a 是一个同步点。从多个线程读取(取消引用)始终是安全的。只有当代码至少有 1 个写入器和另一个读取器/写入器时,这才是一个潜在的问题std::thread
m_mulque