【发布时间】:2021-03-01 04:25:36
【问题描述】:
我想编写一个一次只能由一个线程访问的函数。我不需要忙等待,如果另一个线程已经在运行它,那么残酷的“拒绝”就足够了。到目前为止,这是我想出的:
std::atomic<bool> busy (false);
bool func()
{
if (m_busy.exchange(true) == true)
return false;
// ... do stuff ...
m_busy.exchange(false);
return true;
}
- 原子交换的逻辑是否正确?
- 将两个原子操作标记为
std::memory_order_acq_rel是否正确?据我了解,轻松订购 (std::memory_order_relaxed) 不足以防止重新订购。
【问题讨论】:
-
你曾经需要一个线程来等待吗?或者如果无法获得锁,每个 线程是否会访问它?
-
@DavidSchwartz b) 无法获得锁的线程还有其他事情要做。
-
仅供参考:您尝试实现的东西有一个名称。它被称为mutex。此外,有时称为 advisory lock, 或简称为 lock,,受互斥锁保护的代码行有时称为 critical section。 “互斥”是“互斥”的合成词。
-
另请注意:您试图阻止多个线程同时进入同一个函数的想法会分散注意力。很少有多少线程同时进入同一个函数。 真正重要的是,有多少线程同时访问相同的数据。当只有一个函数可以访问数据时,很容易混淆这两种想法。当有多个函数访问数据时,您可能会遇到麻烦,除非所有函数都锁定同一个互斥体。
标签: c++ multithreading lock-free stdatomic mutual-exclusion