首页 > 解决方案 > C++ atomics:如何只允许一个线程访问一个函数?

问题描述

我想编写一个一次只能由一个线程访问的函数。我不需要忙等待,如果另一个线程已经在运行它,那么残酷的“拒绝”就足够了。到目前为止,这是我想出的:

std::atomic<bool> busy (false);

bool func()
{
    if (m_busy.exchange(true) == true)
        return false;  

    // ... do stuff ...

    m_busy.exchange(false);
    return true;
}
  1. 原子交换的逻辑是否正确?
  2. 将这两个原子操作标记为是否正确std::memory_order_acq_rel?据我了解,宽松的排序 ( std::memory_order_relaxed) 不足以防止重新排序。

标签: c++multithreadinglock-freestdatomicmutual-exclusion

解决方案


您的原子交换实现可能会起作用。但是尝试在没有锁的情况下进行线程安全编程总是充满问题并且通常更难维护。

除非需要提高性能,否则只需std::mutex使用该try_lock()方法即可,例如:

std::mutex mtx;

bool func()
{
    // making use of std::unique_lock so if the code throws an
    // exception, the std::mutex will still get unlocked correctly...

    std::unique_lock<std::mutex> lck(mtx, std::try_to_lock);
    bool gotLock = lck.owns_lock();

    if (gotLock)
    {
        // do stuff
    }

    return gotLock;
}

推荐阅读