参考链接: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. 多个线程产生事件,并将消息放进消息队列,等待处理
  • 队列中应加入信号量或锁来保证进队时的互斥访问,因为多个消息可能同时进队,互相覆盖其队列节点
  • 这里的信号量仅用于进队而没用于出队,理由是消息处理者只有一个,不存在互斥的情形

linux 线程同步的更多相关文章

  1. 【转】 Linux 线程同步的三种方法

    线程的最大特点是资源的共享性,但资源共享中的同步问题是多线程编程的难点.linux下提供了多种方式来处理线程同步,最常用的是互斥锁.条件变量和信号量. 一.互斥锁(mutex) 通过锁机制实现线程间的 ...

  2. Linux线程同步之读写锁(rwlock)

    读写锁和互斥量(互斥锁)很类似,是另一种线程同步机制,但不属于POSIX标准,可以用来同步同一进程中的各个线程.当然如果一个读写锁存放在多个进程共享的某个内存区中,那么还可以用来进行进程间的同步, 和 ...

  3. linux线程同步(1)-互斥量

    一.概述                                                   互斥量是线程同步的一种机制,用来保护多线程的共享资源.同一时刻,只允许一个线程对临界区进行 ...

  4. Linux线程同步

    1. 线程同步: 当多个控制线程共享相同的内存时,需要确保每个线程看到一致的数据视图.当某个线程可以修改变量,而其他线程也可以读取或者修改这个变量的时候,就需要对这些线程进行同步,以确保他们在访问变量 ...

  5. Linux 线程同步的三种方法(互斥锁、条件变量、信号量)

    互斥锁 #include <cstdio> #include <cstdlib> #include <unistd.h> #include <pthread. ...

  6. Linux线程同步:条件变量

    条件变量通过允许线程阻塞和等待另一个线程发送信号的方法弥补了互斥锁的不足,它常和互斥锁一起使用.使用时,条件变量被用来阻塞一个线程,当条件不满足时,线程往往解开相应的互斥锁并等待条件发生变化.一旦其它 ...

  7. Linux线程同步——条件变量

    互斥锁是用来给资源上锁的,而条件变量是用来等待而不是用来上锁的. 条件变量用来自动阻塞一个线程,直到某特殊情况发生为止. 通常条件变量和互斥锁同时使用. 和条件变量使用有关的几个重要函数: int p ...

  8. linux线程同步实例

    [Linux多线程]三个经典同步问题 - 神奕的专栏 - 博客频道 - CSDN.NET http://blog.csdn.net/lisonglisonglisong/article/details ...

  9. linux 线程同步(二)

    信号量 信号量是相互排斥锁的升级版把相互排斥锁中1变成了n.举个简单的样例:如果如今有10个人,有一部手机.这10个人都竞争来使用手机打电话这就是相互排斥锁.对于信号量,如今可能是有4部手机,这10个 ...

  10. linux线程同步(5)-屏障

    一.概述                                                    barrier(屏障)与互斥量,读写锁,自旋锁不同,它不是用来保护临界区的.相反,它跟条 ...

随机推荐

  1. Python第六章(北理国家精品课 嵩天等)

    一 1.集合类型定义及其操作: 集合用{}表示,元素用逗号分隔,无序,唯一 集合操作符: |:并 -:减 &:交 ^ :补 <= <:判断子集关系 >= >:判断包含关 ...

  2. syslog日志打印

    最近syslog出了一次问题,我们配置了不同appname打印到不同文件.现在用不同appname打印log的时候,偶然会混在一起.检查过配置后,觉得不是配置问题,如果是配置问题应该每一条都会打错位置 ...

  3. test for open live writer

    this is a test article post by open live writer.

  4. Hadoop学习笔记1 - 使用Java API访问远程hdfs集群

    转载请标注原链接 http://www.cnblogs.com/xczyd/p/8570437.html 2018年3月从新司重新起航了.之前在某司过了的蛋疼三个月,也算给自己放了个小假了. 第一个小 ...

  5. s21day19 python笔记

    s21day19 python笔记 一.面向对象的基本知识 1.1 基本格式 # 定义类 class 类名: def 方法名(self,name): print(name) return 123 de ...

  6. Java基于opencv—矫正图像

    更多的时候,我们得到的图像不可能是正的,多少都会有一定的倾斜,就比如下面的 我们要做的就是把它们变成下面这样的 我们采用的是寻找轮廓的思路,来矫正图片:只要有明显的轮廓都可以采用这种思路 具体思路: ...

  7. swiper插件使用遇到的一点小问题

    最近做移动端开发 给出的静态页使用了Swiper,用的是4.0.3版本,应该是比较新的. 静态页这种东西,一般就是给你个雏形,设计部虽然使用了这个插件,但毕竟这个活儿毕竟还是得开发人员来干,所以,静态 ...

  8. 第二章代替netcat连接无响应

    按照书上的代码手打到电脑上以后,在两个终端输入了./bhnet.py -l -p 9999 -c和./bhnet.py -t localhost -p 9999之后发现没什么反映,所以又用nmap 1 ...

  9. htop的安装和使用

    1.Ubuntu16.04中htop安装很简单 sudo apt-get install htop 2.htop的使用,直接以普通用户输入htop命令即可执行 关于其基本介绍和使用方式在见下 http ...

  10. Unity 常用插件1

    作者:Meta42链接:https://www.zhihu.com/question/29097415/answer/229015898来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转 ...