【Linux】线程总结:线程同步 -互斥锁,条件变量,信号量实现多生产者多消费者模型

本文介绍了在Linux环境中,如何使用互斥量、条件变量和信号量进行线程同步,以实现多生产者多消费者模型。详细讲解了互斥锁的概念、接口及注意事项,条件变量的使用方法,以及信号量的接口和应用实例。通过这些技术,可以有效保护临界资源,避免并发问题。
摘要由CSDN通过智能技术生成

学习环境 :  Centos6.5 Linux 内核 2.6

Linux线程部分总结分为两部分:(1)线程的使用 ,(2)线程的同步与互斥。

第一部分线程的使用主要介绍,线程的概念,创建线程,线程退出,以及线程的终止与分离。【完成】 地址:【Linux】线程总结:初识、创建、等待、终止、分离

第二部分主要介绍在多线程环境下,使用同步与互斥保护共享资源,有互斥锁,条件变量,信号量,以及读写锁。

第二部分开始 (第二部分,拖了快三个月,终于要出生了)

互斥量

描述

互斥变量用来保证同一时刻只有一个线程访问需要保护的代码,用来保证临界资源的数据一致性。本质上可理解为是一把锁,在访问共享资源之前申请锁,只有你一个拿着钥匙,别人要进入就必须等你出去后把钥匙交给他们才可以。一旦使用完毕就要释放锁资源,给别人一个机会。 在使用的时候要注意,申请锁资源与释放锁资源的顺序,避免死锁的产生。

接口


#include<pthread>
/* 动态初始化 */
int pthread_mutex_init(       pthread_mutex_t* mutex, 
                        const pthread_mutexattr_t* mutexattr);
/* 销毁 */
int pthread_mutex_destroy( pthread_mutex_t* mutex);
/* 申请锁资源 */
int pthread_mutex_lock   ( pthread_mutex_t* mutex);
/* 非阻塞申请锁资源 */
int pthread_mutex_trylock( pthread_mutex_t* mutex);
/* 释放锁资源 */
int pthread_mutex_unlock ( pthread_mutex_t* mutex);

上述接口的第一个参数 mutex 都是定义的 pthread_mutex_t结构体指针,用来操作目标互斥锁。

互斥锁在使用之前必须初始化,pthread_mutex_init函数用于动态初始化互斥锁,mutexattr 参数指定互斥锁的属性。还可以静态分配,设置为常量 PTHREAD_MUTEX_INITALIZER。如果是动态初始化则在使用完成后需要调用pthread_mutex_destory释放资源。

pthread_mutex_lock函数以原子操作的方式给一个互斥锁加锁。如果目标互斥锁已经被锁上,该函数的其余调用者将被阻塞,直到互斥锁的占有者将其解锁。

pthread_mutex_trylock函数非阻塞式加锁,如果已经被加锁时,该函数立即返回错误码 EBUSY。

pthread_mutex_unlock函数以原子操作的方式的给一个互斥锁解锁。如果此时有其他线程在等待这个互斥锁,解锁后将会有一个线程获得该锁。

具体使用方法可参照博客:线程安全与线程不安全,有一个互斥量的简单示例。

条件变量

互斥锁用于同步线程对共享数据的访问,而条件变量用于在线程之间同步共享数据的值,给多个线程提供了一个会合的场所。

条件变量本身是由互斥量保护的。线程在改变条件状态之前必须先锁住。

接口

#include <pthread.h>

/* 动态初始化 */
int pthread_cond_init(pthread_cond_t* cond, const pthread_condattr_t* cond_attr);
/* 销毁资源*/
int pthread_cond_destroy(pthread_cond_t* cond);
/* 等待cond 条件发生 */
int pthread_cond_wait(pthread_cond_t* cond, pthread_mutex_t* mutex);
/* 通知 cond 条件发生,只通知一个线程 */
int pthread_cond_signal(pthread_cond_t* cond);
/* 通知cond条件发生,通知所有进程 */
int pthread_cond_broadcast(pthread_cond_t* cond);

静态初始化, 设置宏 PTHREAD_COND_INITIALIZER

使用实例:基于互斥锁和条件变量单缓冲区(一次只能有一个对象操作)多生产者多消费者模型

有一个链表,限制最多可插入10个结点,
一个互斥锁保护对链表的操作,
两个条件变量通知满 10 以及 为空。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值