linux环境编程-线程同步【互斥锁】

一.同步概念

在生活中,我们的同步往往都是同时起步,协调一致。但是不通的对象对“同步”的理解方式有稍许不同,如设备同步,指的是两个或者多个设备之间规定一个共同的时间参考;数据同步,操作的数据和数据库内容保存一致;文件同步指的是内存中的操作的数据和文件中的数据保持一致。

而在编写代码中,通信中所说的同步与生活中大家说的同步有些差异,“同”表示协同,协助,互相配合。主旨在于协同步调,按预定的先后次序运行。

二.线程同步

 线程同步说白就是 多个线程共同协调的 操作一个或者多个共享资源。因为线程是异步执行的【自己执行自己的,你管我执行到那里了】。因此当多个线程操作同一个资源的时候,就会发生混乱和资源竞争,可能引起资源数据被弄紊乱。所以要用线程同步,然想成协调的 有先后次序的 操作这个 资源,而不是抢。【其实是换了一个抢的目标,去抢互斥锁了而不是数据

三.互斥量(mutex)【互斥锁是一种建议锁,不上锁不解锁的线程依旧可以操作共享资源,出现紊乱】,所以我们要遵循一个约定就是要上锁后才操作,操作完就解锁互斥量mutex,Linux中提供一把互斥锁 mutex (也称之为互斥量)。每个线程在对资源操作前都尝试先加锁,成功加锁才能操作,操作结束解锁。资源还是共享的,线程间也还是竞争的,但通过“锁”就将资源的访问变成互斥操作,而后与时间有关的错误也不会再产生了。如图


主要应用函数:
pthread_ mutex. init 函数
pthread_ mutex_ destroy 函数
pthread_ mutex_ lock 函数
pthread_ mutex_ trylock 函数
pthread_ mutex_ unlock 函数

以上5个函数的返回值都是:成功返回0,失败返回错误号。 .
pthread_ mutex_t类型,其本质是一个结构体。为简化理解,应用时可忽略其实现细节,简单当成整数看待。
pthread_mutex_t mutex;变量mutex.只有两种取值1、0。
 

四.有关互斥锁函数的详细介绍

1.pthread_ mutex init 函数
初始化一个互斥锁(互斥量)-->初值可看作1
int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr);
参1:传出参数,调用时应传&mutex ;
restrict关键字:只用于限制指针,告诉编译器,所有修改该指针指向内存中内容的操作,只能通过本指针完成。
不能通过除本指针以外的其他变量或指针修改

参2:互斥量属性。是一个传入参数,通常传NULL,选用默认属性(线程间共享)。参 APUE.12.4同步属性

扫描二维码关注公众号,回复: 12035953 查看本文章
  • 1. 静态初始化:如果互斥锁mutex 是静态分配的(定义在全局,或加了static关键字修饰),可以直接使用宏进行初始化。pthread_mutex_t muetx = PTHREAD_MUTEX_INITIALIZER;
  • 2.动态初始化:局部变量应采用动态初始化。pthread_ mutex init(&mutex, NULL)
     

2.pthread_mutex_destroy 函数
销毁一个互斥锁
int pthread_mutex_destroy(pthread_ mutex_ t *mutex);


3.pthread mutex lock 函数
加锁。可理解为将mutex-- (或-1)
int pthread_ mutex_ lock(pthread_ mutex_t *mutex);


4.pthread_ mutex_unlock 函数
解锁。可理解为将mutex++ (或+1)
int pthread_ mutex _unlock(pthread_ mutex _t * mutex);
 

5.pthread_ mutex_trylock 函数
尝试加锁
int pthread_mutex_trylock(pthread_mutex_t * mutex);
这个pthread_mutex_trylock意思是加锁,如果加不上就算了【非阻塞加锁】,就会去干别的事情。所以这个函数应该采用  轮循的方式调用

猜你喜欢

转载自blog.csdn.net/qq_44065088/article/details/109186498