Linux 多线程同步机制:互斥量、信号量、条件变量

互斥量:互斥量提供对共享资源的保护访问,它的两种状态:lockunlock,用来保证某段时间内只有一个线程使用共享资源,互斥量的数据类型是pthread_mutex_t

主要涉及函数:pthread_mutex_lock()  pthread_mutex_trylock()   pthread_mutex_unlock()

             Pthreaf_mutex_init()  pthread_mutex_destroy()

lockunlock之间所锁定的区域为临界区域(如果只加锁不解锁程序会阻塞等待)

信号量信号量是一个特殊的整数值,主要用来控制多个线程(进程)对临界资源的互斥访问,线程根据信号量来判断是否有访问的资源,信号量是一种线程同步机制,信号量与信号不同。

    信号量是一个计数器,可用于同步多线程对共享数据对象得访问,为了获得共享资源,线程需要执行以下操作:

1、测试控制该资源的信号量

2、若此信号量的值为正,则线程可以使用该资源,线程将信号量值减1,表示它使用了一个资源单位

3、若此信号量的值为0,则线程进入睡眠状态,直至信号量值大于0。当线程被唤醒后,它返回至第1步。

条件变量: 只用互斥量很可能会引起死锁,为此引入了条件变量,条件变量允许线程阻塞和等待另一个线程发送的信号,使用条件变量可以以原子方式阻塞线程,直到满足某个条件为止,可以避免忙等。

条件变量常和互斥锁一起使用,互斥量主要用来保证对临界区的互斥进入,而条件变量则用于线程的阻塞等待,互斥锁定进入临界区以后,若条件不满足,线程便转为等待状态,等待条件满足后被唤醒执行,否则继续执行,执行完后开锁

条件变量的数据类型是pthread_cond_t

主要涉及函数:pthread_cond_init()  pthread_cond_signal() pthread_cond_wait()

              Pthread_cond_timewait()    pthread_cond_broadcast()

Pthread_cond_wait()函数作用:

1.先对传入的互斥量mutex解锁(自动释放即解锁)

    2.再wait阻塞等待(阻塞被别的线程的pthread_cond_singal()唤醒后必须先加锁再执行)

 读写锁rwlock:

分为:rdlock(读锁):只要没有线程持有某个给定的读写锁用于写,那么任意数目的线程可以持有该读写锁用于读,共享锁

      wrlock(写锁):仅当没有线程持有某个给定的读写锁用于读或者写时,才能分配该读写锁用于写,独占锁

pthread_rwlock_trwlock=PTHREAD_RWLOCK_INITIALIZER;(初始化读写锁)

pthread_rwlock_rdlock(&rwlock):分配读锁

pthread_rwlock_wrlock(&rwlock):分配写锁

pthread_rwlock_unlock(&rwlock):解锁(只有解读写锁)

 

写锁解锁后多个线程在同等条件下分配读锁和写锁时先分配写锁(优先考虑分配写锁,但这不是必须的(系统不同))

猜你喜欢

转载自blog.csdn.net/xd_rbt_/article/details/79843899