多线程同步机制

Posted cs0915

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程同步机制相关的知识,希望对你有一定的参考价值。

一、多线程的特点:并发和异步

同步是指一个事件一个事件的完成,只有完成了上面的事件才能开始下面的事件;异步是指一个调用或请求发给调用者,调用者不用等待结果的返回而继续当前的处理。为了防止并发和异步带来线程间资源的竞争的无序性,需要引入同步机制。同步机制有互斥量(互斥锁)、读写锁和条件变量。

二、临界资源和临界区

临界资源指同一时间只允许一个线程访问的资源 

临界区是指每个线程中访问临界资源的代码

要使线程互斥的访问资源,即应当让它们互斥的进入临界区。

三、

1.互斥锁

工作流程:创建一个互斥锁并初始化它,上锁,解锁,不用的时候销毁它。

//定义一个互斥量
pthread_mutex_t mutex;

//互斥锁的初始化
//动态初始化
int pthread_mutex_init(pthread_mutex_t* restrict mutex,const pthread_mutexattr_t* restrict attr);//attr为属性,NULL表示默认属性
//静态初始化
pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;

//上锁
int pthread_mutex_lock(pthread_mutex_t* mutex);//如果其它线程已经把互斥锁上锁,则这里阻塞线程
int pthread_mutex_trylock(pthread_mutex_t* mutex);//尝试上锁,若已经上锁了,不阻塞,立即返回EBUSY
//解锁 int pthread_mutex_unlock(pthread_mutex_t* mutex); //互斥锁的销毁 int pthread_mutex_destroy(pthread_mutex_t* mutex);

2.读写锁

比互斥锁具有更高的并行性,但速度未必比互斥锁快,因为读写锁开销更大。以读模式加锁后仍可以以读模式加锁,并不会造成阻塞。读的时候,只要有写的线程来了,后面再来的读线程也会被阻塞,防止写线程一直等。

//创建并初始化
pthread_rwlock_t rwlock=PTHREAD_RWLOCK_INITIALIZER;
//动态初始化
int pthread_rwlock_init(pthread_rwlock_t* restric rwlock,const pthread_rwlock_t* restrict attr);

//上锁
//读锁
int pthread_rwlock_rdlock(pthread_rwlock_t* rwlock);
int pthread_rwlock_trylock(pthread_rwlock_t* rwlock);//不阻塞,立即返回EBUSY
//写锁
int pthread_rwlock_wrlock(pthread_rwlock_t* rwlock);
int pthread_rwlock_trywrlock(pthread_rwlock_t* rwlock);

//解锁,无需说明是读锁还是写锁
int pthread_rwlock_unlock(pthread_rwlock_t* rwlock);

//读写锁销毁
int pthread_rwlock_destroy(pthread_rwlock_t* rwlock);

3.条件变量

条件变量一般结合互斥锁来使用

//创建条件变量并初始化
pthread_cond_t cond=PTHREAD_COND_INITIALIZER;
//动态初始化
int pthread_cond_init(pthread_cond_t * cond,pthread_condattr_t* cond_attr);//cond_attr为属性,NULL表示默认属性

//等待条件变量
int thread_cond_wait(pthread_cond_t * restrict cond,pthread_cond_t * restrict mutex);//调用之前应当先把互斥量上锁,然后该函数解开锁,然后阻塞等待条件成立,由下面的函数唤醒,并锁上互斥量

//唤醒等待条件变量的线程
int pthread_cond_signal(pthread_cond_t* cond);//只唤醒一个等待条件变量的线程
int pthread_cond_broadcast(pthread_cond_t* cond);//唤醒所有等待线程

//条件变量的销毁
int pthread_cond_destroy(pthread_cond_t* cond);

 

以上是关于多线程同步机制的主要内容,如果未能解决你的问题,请参考以下文章

java多线程——锁机制synchronized(同步方法)

Java多线程的同步机制(synchronized)

多线程同步机制

多线程同步机制

阶段1 语言基础+高级_1-3-Java语言高级_05-异常与多线程_第3节 线程同步机制_4_解决线程安全问题_同步代码块

Python多线程同步