c++ mutex

发布时间 2023-06-15 09:56:05作者: 封兴旺

mutex 直译为 互斥量。

使用它可以做到:一份共享数据, 同时只能由一个线程访问,在此基础上会衍生很多很方便的api,通过mutex将共享数据的访问变成互斥操作,避免与时间相关的错误

简单结论及定义:

  1. 每个线程在对资源操作前都尝试先加锁,加锁成功才能操作,操作结束就解锁

   2. 当A线程对某个全局变量加锁访问,B在访问前尝试加锁,拿不到锁,B阻塞。C线程不去加锁,而直接访问该全局变量,依然能够访问(这样数据就有点混乱了)

  3.  如果一个互斥量当前没有被锁住,A线程将该互斥量锁住,解锁之前,A线程一直拥有该锁。

  4. 如果一个互斥量已经被其他线程锁住了,则当前的调用它的线程被阻塞住。

  5. 如果当前互斥量被当前调用线程锁住,则会产生死锁(deadlock)

接口:

  C++11中提供了std::mutex互斥量,共包含四种类型:

    std::mutex:最基本的mutex类。

    std::recursive_mutex:递归mutex类,能多次锁定而不死锁。

    std::time_mutex:定时mutex类,可以锁定一定的时间

    std::recursive_timed_mutex:定时递归mutex类。

  两种锁类型:

     std::lock_guard:方便线程对互斥量上锁

    std::unique_lock:方便线程对互斥量上锁,但提供了更好的上锁和解锁控制

  相关的函数:

    std::try_lock:尝试同时对多个互斥量上锁

    std::lock:可以同时对多个互斥量上锁

    std::call_once:如果多个线程需要同时调用某个函数,call_once可以保证多个线程对该函数只调用一次