多线程同步机制
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(同步方法)
阶段1 语言基础+高级_1-3-Java语言高级_05-异常与多线程_第3节 线程同步机制_4_解决线程安全问题_同步代码块