码迷,mamicode.com
首页 > 编程语言 > 详细

多线程同步机制

时间:2020-06-08 14:29:09      阅读:62      评论:0      收藏:0      [点我收藏+]

标签:线程同步   color   col   资源   pre   adc   模式   异步   多线程同步   

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

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

二、临界资源和临界区

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

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

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

三、

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);

 

多线程同步机制

标签:线程同步   color   col   资源   pre   adc   模式   异步   多线程同步   

原文地址:https://www.cnblogs.com/cs0915/p/13065169.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!