线程的互斥与同步机制

  • 线程的互斥机制:
  • 1、互斥也称为间接制约关系
  • 2、对临界资源的访问,需要互斥的进行,即同一时刻只有一个线程访问临界资源
  • 3、常用的工具:互斥锁
  • 互斥锁API:
	#include 
	
	1.定义互斥锁
	
	    pthread_mutex_t lock;
	
	    pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;//静态初始化
	
	2.初始化互斥锁
	
	
	   int pthread_mutex_init(pthread_mutex_t *mutex, 
	        const pthread_mutexattr_t *mutexattr);
	
	   功能:动态初始化互斥锁
	
	   参数:
	
	        mutex:要初始化的锁
	
	        mutexattr:属性 一般传 NULL
	
	   返回值:
	
	        总是会成功 返回0
	
	3.上锁
	
	    int pthread_mutex_lock(pthread_mutex_t *mutex);
	
	    功能:上锁(如果没有锁可以上锁,线程将被阻塞)
	
	    参数:mutex 互斥锁指针
	
	    返回值:成功 0 失败 错误码
	
	    int pthread_mutex_trylock(pthread_mutex_t *mutex);
	
	    功能:尝试上锁(如果没有锁可以上锁,线程不会被阻塞,而是立即返回错误)
	
	    参数:mutex 互斥锁指针
	
	    返回值:成功 0 失败 错误码
	
	4.解锁
	
	    int pthread_mutex_unlock(pthread_mutex_t *mutex);
	
	    功能:解锁(一般使用时,只有加锁的线程可以解锁)
	
	    参数:mutex 互斥锁指针
	
	    返回值:成功 0 失败 错误码
	
	5.销毁互斥锁
	
	    int pthread_mutex_destroy(pthread_mutex_t *mutex);
	
	    功能:在不需要使用互斥锁的时候销毁互斥锁
	
	    参数:mutex 互斥锁指针
	
	    返回值:成功 0 失败 错误码
  • 线程的同步机制:
  • 1、同步也称为直接制约关系
  • 2、提前已经知道线程的执行顺序,控制线程按顺序执行的过程就叫做同步
  • 3、常用的工具:无名信号量(线程量少)、条件变量(线程量多);
  • 4、模型:生产者-消费者
  • 无名信号量API:
	#include 
	
	1.定义无名信号量
	
	    sem_t  sem;
	
	2.初始化无名信号量
	
	    int sem_init(sem_t *sem, int pshared, unsigned int value);
	
	    功能:初始化无名信号量
	
	    参数:
	
	        sem:无名信号量指针
	
	        pshared:
	
	            0:两个线程间同步
	
	            非0:两个进程间同步
	
	       value:信号量的初始值
	
	           如果是1表示可以获取信号量
	
	           如果是0表示不可以获取信号量
	    返回值:
	
	        成功 0
	
	        失败 -1 重置错误码 
	
	无名信号量是荷兰计算器科学家发明的,PV操作的PV来自荷兰语。
	
	3.获取信号量(P操作)
	
	    int sem_wait(sem_t *sem);
	
	    功能:获取信号量 (将信号量的值-1)
	
	        如果信号量的值已经是0了,则sem_wait会阻塞,
		等到能执行减1操作位置
	    
	    参数:sem:无名信号量指针
	
	    返回值:
	
	        成功 0
	
	        失败 不会改变信号量的值 返回 -1 重置错误码 
	
	4.释放信号量(V操作)
	
	    int sem_post(sem_t *sem);
	
	    功能:释放信号量(将信号量的值+1)
	
	
	    参数:sem:无名信号量指针
	
	    返回值:
	
	        成功 0
	
	        失败 不会改变信号量的值 返回 -1 重置错误码 
	
	5.销毁无名信号量
	
	    int sem_destroy(sem_t *sem);
	
	    功能:销毁无名信号量
	
	    参数:sem:无名信号量指针
	
	    返回值:
	
	        成功 0
	
	        失败 -1 重置错误码
  • 条件变量API:
	#include 
	
	1.定义条件变量
	
	    pthread_cond_t cond;
	
	    pthread_cond_t cond = PTHREAD_COND_INITIALIZER;//静态初始化
	
	2.初始化条件变量
	
	    int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr);
	    
	    功能:动态初始化条件变量
	
	    参数:
	        cond:条件变量指针
	
	        cond_attr:条件变量的属性 NULL 表示使用默认属性
	
	    返回值:
	
	        成功 0  失败 错误码
	
	3.获取条件变量
	
	    int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);
	
	    功能:获取条件变量
	
	    参数:
	
	        cond:条件变量指针
	
	        mutex:互斥锁指针
	
	    返回值:
	
	        成功 0  失败 错误码
	
	    使用流程:
	
	        1.先获取到互斥锁
	
	        (可以先完成一些任务初始化的工作)
	
	        2.调用pthread_cond_wait
	
	            2.1 将当前线程添加到队列中
	
	            2.2 解锁
	
	            2.3 在队列中休眠
	
	            2.4 重新获取锁
	
	                这时,如果等待的条件没有发生,会继续解锁、休眠
	
	                如果等待的条件发生了,会将线程在队列中移除
	
	        3.执行后续的任务
	
	        4.解锁
	
	4.释放条件变量
	
	    int pthread_cond_signal(pthread_cond_t *cond);
	
	    功能:释放一个条件变量,唤醒至少一个等待条件的线程
	
	    参数:cond:条件变量指针
	
	    返回值:成功 0  失败 错误码
	
	    int pthread_cond_broadcast(pthread_cond_t *cond);
	
	    功能:释放所有的资源,唤醒所有等待条件的线程
	
	    参数:cond:条件变量指针
	
	    返回值:成功 0  失败 错误码
	
	5.销毁条件变量
	
	    int pthread_cond_destroy(pthread_cond_t *cond);
	
	    功能:销毁条件变量
	
	    参数:cond:条件变量指针
	
	    返回值:成功 0  失败 错误码

你可能感兴趣的:(编程基础,C语言,算法)