多线程同步之互斥锁

互斥锁

互斥锁主要用于对共享资源的保护,防止两个或多个线程对共享资源同时进行写入操作。

若没有互斥锁保护共享资源,对共享资源的写入操作是随机可,可能是线程A写入的值,也可能是线程B写入的,结果就是哪个线程都没有写入成功;互斥锁就是在写共享资源时,保证该线程对共享资源的独享,写入成功后,再开锁,使其他线程可以写。

API

POSIX 支持以下接口:

pthread_mutex_t mutex; /*定义mutex 变量*/

pthread_mutex_init() /* 创建mutex资源*/

pthread_mutex_destroy() /*销毁mutex资源*/

pthread_mutex_lock() /*上锁*/

pthread_mutex_unlock() /*解锁*/

pthread_mutex_trylock() /* 尝试加锁,已加锁,返回。*/

C++ 11 支持以下接口:

std::mutex /*最基本的 Mutex 类*/
std::recursive_mutex /*递归 Mutex 类*/
std::time_mutex /*定时 Mutex 类*/
std::recursive_timed_mutex /*定时递归 Mutex 类*/

死锁

互斥锁解决了上述问题,同时,也会带来一个特有的问题,即死锁。

  • 如何发生
    • 上锁后,忘记解锁
    • 优先级反转,低优先级线程加锁,被高优先级线程抢占,但高优先级线程需要等待解锁
  • 如何解决
    • 避免多次上锁
    • 共享资源访问完毕后,解锁;或加锁时,使用trylock
    • 多个共享资源,多线程顺序访问;访问共享资源前,解锁已经加锁的锁
    • 加入检测死锁的模块

你可能感兴趣的:(EmbeddedLinux,C++,linux,c++)