加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

linux 线程同步

发布时间:2020-12-14 01:34:27 所属栏目:Linux 来源:网络整理
导读:参考链接:https://blog.csdn.net/daaikuaichuan/article/details/82950711#font_size5font_2 一,互斥锁 ??? #include pthread.h #include time.h ?? ?// 初始化一个互斥锁。 ?? ?int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutexattr_t

参考链接:https://blog.csdn.net/daaikuaichuan/article/details/82950711#font_size5font_2

一,互斥锁

??? #include <pthread.h> #include <time.h>
?? ?// 初始化一个互斥锁。
?? ?int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutexattr_t *attr);
?? ?// 对互斥锁上锁,若互斥锁已经上锁,则调用者一直阻塞,
?? ?// 直到互斥锁解锁后再上锁。
?? ?int pthread_mutex_lock(pthread_mutex_t *mutex);
?? ?// 调用该函数时,若互斥锁未加锁,则上锁,返回 0;
?? ?// 若互斥锁已加锁,则函数直接返回失败,即 EBUSY。
?? ?int pthread_mutex_trylock(pthread_mutex_t *mutex);
?? ?// 当线程试图获取一个已加锁的互斥量时,pthread_mutex_timedlock 互斥量
?? ?// 原语允许绑定线程阻塞时间。即非阻塞加锁互斥量。
?? ?int pthread_mutex_timedlock(pthread_mutex_t *restrict mutex,const struct timespec *restrict abs_timeout);
?? ?// 对指定的互斥锁解锁。
?? ?int pthread_mutex_unlock(pthread_mutex_t *mutex);
?? ?// 销毁指定的一个互斥锁。互斥锁在使用完毕后,
?? ?// 必须要对互斥锁进行销毁,以释放资源。
?? ?int pthread_mutex_destroy(pthread_mutex_t *mutex);


二, 条件变量

  【条件变量的操作流程如下】:(必须和互斥锁同用)

  1. 初始化:init()或者pthread_cond_tcond=PTHREAD_COND_INITIALIER;属性置为NULL;

  2. 等待条件成立:pthread_cond_waitpthread_cond_timewait释放锁,并阻塞等待条件变量为真 pthread_cond_timewait()设置等待时间,仍未signal,返回ETIMEOUT(加锁保证只有一个线程wait);

  3. 激活条件变量:pthread_cond_signal,pthread_cond_broadcast(激活所有等待线程)

  4. 清除条件变量:pthread_cond_destroy;无线程等待,否则返回EBUSY清除条件变量:destroy;无线程等待,否则返回EBUSY

?

三,信号量(Android中无,可以用互斥锁+条件变量共同实现)

??? #include <semaphore.h>?
?? ?int sem_init(sem_t *sem,int pshared,unsigned int value); // 初始化信号量 ??

 int sem_wait(sem_t *sem); ?// 信号量 P 操作(减 1)

 int sem_trywait(sem_t *sem); ?// 以非阻塞的方式来对信号量进行减 1 操作

??? int sem_post(sem_t *sem); // 信号量 V 操作(加 1)
??? int sem_getvalue(sem_t *sem,int *sval); // 获取信号量的值
??? int sem_destroy(sem_t *sem);// 销毁信号量

四,消息队列(用互斥锁/信号量和数据结构实现)

?参考:https://www.cnblogs.com/skyfsm/p/6266404.html

  线程中的消息队列实现并不难,总的来说有以下几点:

  1. 自定义消息结构,并构造队列
  2. 一个线程负责依次从消息队列中取出消息,并处理该消息
  3. 多个线程产生事件,并将消息放进消息队列,等待处理

?

  • 队列中应加入信号量或锁来保证进队时的互斥访问,因为多个消息可能同时进队,互相覆盖其队列节点
  • 这里的信号量仅用于进队而没用于出队,理由是消息处理者只有一个,不存在互斥的情形

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读