Mutex & Atomic

mutex

mutex 是用于保护共享数据免受多个线程同时访问的同步原语。

std::mutex mutex;

mutex.lock();

// do something else
// but race condition

mutex.unlock();

但是我们一般不用 mutex 对 race condition 上锁,而是用 std::unique_lock,std::lock_guard 这些更安全的方式。

lock_guard

std::lock_guard 是接受一个 mutex 的类(RAII),在获取资源时既初始化。 在作用域中创建 lock_guard 并获取 mutex,在离开作用域时销毁 lock_guard,释放锁。

std::mutex mutex;
{
    std::lock_guard<std::mutex> lg(mutex);
}

unique_lock

unique_lock 和 lock_guard 十分相似,只不过前者可以作为函数返回值,扩展其作用域。

std::mutex mutex;
{
    std:unique_lock<std::mutex> ul(mutex);
    ul.unlock();
    ul.lock();
}

std::unique_lock<std::mutex> f() {
    std::unique_lock<std::mutex> ul(mutex);
    return ul;
}

atomic

std::atomic 是一个模板类,创建一个原子对象。可以免受多线程访问时的 race condition。

std::atomic<int> gv = 0;

最后更新于