一 why
先给自己打个广告,本人的微信公众号:嵌入式Linux江湖,主要关注嵌入式软件开发,股票基金定投,足球等等,希望大家多多关注,有问题可以直接留言给我,一定尽心尽力回答大家的问题。
在博客《Linux线程同步(一)—“初识篇”》中,介绍了为什么需要线程同步,从本篇博客开始介绍如何实现线程同步,本篇主要介绍的是互斥锁实现线程同步。
二 how
Linux提供一把互斥锁mutex(也称之为互斥量)。
每个线程在对资源操作前都尝试先加锁,成功加锁才能操作,操作结束后解锁。
资源还是共享的,线程间也还是竞争的,但通过锁将资源的访问变为互斥操作,而后与时间有关的错误也不会在产生了。
同一个时刻,只能有一个线程持有该锁,比如线程A拥有了这把锁,其他线程都无法拥有这把锁。只有获得这把锁的线程才可以访问临界区,其他没有获得这把锁的线程都无法访问临界区。
互斥锁实质上是是操作系统提供的一把“建议锁”(又称“协同锁”),建议程序中有多线程访问共享资源的时候使用该机制,但是,并没有强制限定。
2.1 相关函数
互斥锁相关的函数主要有:初始化函数,销毁函数,加锁函数,以及解锁函数
初始化
pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutex_attr *restrict attr)
参数1:传出参数,调用时应传&mutex
restrict关键字:只用于限制指针,告诉编译器,所有修改该指针指向内存中内容的操作,只能通过本指针完成。不能通过除本指针以外的其他变量或指针修改。
参数2:互斥属性。是一个传入参数,通常传NULL,选用默认属性(线程间共享).
静态初始化:如果互斥锁mutex是静态分配的(定义在全局,或加了static关键字修饰),可以直接使用宏进行初始化。pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
动态初始化:局部变量应采用动态初始化。pthread_mutex_init(&mutex, NULL);
销毁
pthread_mutex_destroy(pthread_mutex_t *mutex