前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >UNPv2第七章:互斥锁与条件变量

UNPv2第七章:互斥锁与条件变量

作者头像
提莫队长
发布2019-02-21 10:49:03
8370
发布2019-02-21 10:49:03
举报
文章被收录于专栏:刘晓杰刘晓杰

1 互斥锁:上锁和解锁

代码语言:javascript
复制
#include<pthread.h>
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_trylock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);

 pthread_mutex_lock()函数是一个阻塞型的上锁函数,若互斥锁已经上了锁,调用pthread_mutex_lock()函数对互斥锁再次上锁的话,调用线程会阻塞,直到当前互斥锁被解锁。  pthread_mutex_trylock()函数是一个非阻塞型的上锁函数,如果互斥锁没被锁住,pthread_mutex_trylock()函数将把互斥锁加锁, 并获得对共享资源的访问权限;如果互斥锁被锁住了,pthread_mutex_trylock()函数将不会阻塞等待而直接返回EBUSY(已加锁错误),表示共享资源处于繁忙状态。  如果互斥锁变量mutex已经上锁,调用pthread_mutex_unlock()函数将解除这个锁定,否则直接返回。该函数唯一的参数mutex是pthread_mutex_t数据类型的指针。该函数调用成功返回0,否则返回-1。

2 条件变量:等待与信号发送

代码语言:javascript
复制
#include<pthread.h>
int pthread_cond_wait(pthread_cond_t *cptr, pthread_mutex_t *mptr);
int pthread_cond_signal(pthread_cond_t *cptr);
均返回:若成功则为0,若出错则为正的Exxx值

 pthread_cond_wait() 用于阻塞当前线程,等待别的线程使用pthread_cond_signal()或pthread_cond_broadcast来唤醒它。 pthread_cond_wait() 必须与pthread_mutex 配套使用。  pthread_cond_signal函数的作用是发送一个信号给另外一个正在处于阻塞等待状态的线程,使其脱离阻塞状态,继续执行.如果没有线程处在阻塞等待状态,pthread_cond_signal也会成功返回。

3 条件变量:定时等待和广播

代码语言:javascript
复制
#include<pthread.h>
int pthread_cond_broadcast(pthread_cond_t *cptr);
int pthread_cond_timewait(pthread_cond_t *cptr,pthread_mutex_t *mptr, const struct timespc *abstime);

 通常pthread_cond_signal只唤醒等待在相应条件变量上的一个线程。在某些情况下,一个线程认定有多个其他线程应被唤醒,这时它可以调用pthread_cond_broadcast唤醒阻塞在相应条件变量上的所有线程。  对于pthread_cond_timewait(…),其允许线程就阻塞时间设置一个限制值。

4 互斥锁和条件变量的属性

在前面的互斥锁和条件变量的讲解中,我们用两个常量PTHREAD_MUTEX_INITIALIZER和PTHREAD_COND_INITIALIZER来初始化它们。有这种方式初始化的互斥锁和条件变量具备默认属性,不过我们还能以非默认属性来初始化它们。

代码语言:javascript
复制
#include<pthread.h>
int pthread_mutex_init(pthread_mutex_t *mptr,const pthread_mutex_mutexattr_t *attr);
int pthread_mutex_destory(pthread_mutex_t *mptr);
int pthread_cond_init(pthread_cond_t *cptr,const pthread_cond_condattr_t *attr);
int pthread_cond_destory(pthread_cond_t *cptr);
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016年04月27日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 互斥锁:上锁和解锁
  • 2 条件变量:等待与信号发送
  • 3 条件变量:定时等待和广播
  • 4 互斥锁和条件变量的属性
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档