一、信号量

信号量就是操作系统中所用到的PV原子操作,它广泛用于进程或线程间的同步与互斥。信号量本质上是一个非负的整数计数器,它被用来控制对公共资源的访问。

PV原子操作主要用于进程或线程间的同步和互斥这两种典型情况。若用于互斥,几个进程(或线程)往往只设置一个信号量sem,如图1。

当信号量用于同步操作时,往往设置多个信号量,并安排不同的初始值来实现它们之间的顺序执行,它们的操作如图。

二、主要函数

       #include <semaphore.h>int sem_init(sem_t *sem, int pshared, unsigned int value);//初始化sem操作
/*pshared参数指示此信号量是在进程的线程之间共享,还是在进程之间共享。如果pshared的值为0,则信号量在进程的线程之间共享,并且应该位于所有线程都可见的某个地址(例如,全局变量或在堆上动态分配的变量)。value即为sem的初始值*/int sem_wait(sem_t *sem);//P操作、信号量大于0时信号量减1、等于0阻塞int sem_trywait(sem_t *sem);//P操作、信号量大于0时信号量减1、等于0不会阻塞立即返回int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout);
/*sem_timedwait()与sem_wait()相同,只是abs_timeout指定了一个限制,如果不能立即执行减量,则调用应该阻止的时间量。abs_timeout参数指向一个结构,该结构指定自1970-01-01 00:00:00+0000(UTC)纪元以来的绝对超时(以秒和纳秒为单位)。
该结构定义如下:struct timespec {time_t tv_sec;      /* Seconds */long   tv_nsec;     /* Nanoseconds [0 .. 999999999] */};
*/int sem_post(sem_t *sem);//V操作、信号量的值加1int sem_getvalue(sem_t *sem, int *sval);//获取信号量的值int sem_destroy(sem_t *sem);//销毁信号量Link with -pthread.

三、线程间通信同步操作实例

功能简介:每隔1秒输出"张三 18"

/*########################################################################
# File Name: test_pthread_sig.c
# Author: tanyaduckal
# mail: 2295375354@qq.com
# Created Time: 2022年01月04日 星期二 17时24分40秒
########################################################################*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>#define CORVAL 1
#define NORVAL 0
#define ERRVAL -1
#define handle_error(LOG) do { perror(LOG); exit(EXIT_FAILURE); } while(0)
#define qDbug() do { printf("%d\n", __LINE__); } while(0)#include<pthread.h>
#include<semaphore.h>
#include<unistd.h>typedef struct argument{char *name;int age;
}ARG;
void *start_routine1(void *arg);
void *start_routine2(void *arg);
sem_t sem1;
sem_t sem2;int main(int argc,char **argv){if(ERRVAL == sem_init(&sem1, 0, 1))handle_error("sem_init");if(ERRVAL == sem_init(&sem2, 0, 0))handle_error("sem_init");pthread_t thread1, thread2;ARG arg = {"张三", 18};if(0 != pthread_create(&thread1, NULL, start_routine1, (void *)&arg))handle_error("pthread_create");if(0 != pthread_create(&thread2, NULL, start_routine2, (void *)&arg))handle_error("pthread_create");if(0 != pthread_join(thread1, NULL))handle_error("pthread_join");if(0 != pthread_join(thread2, NULL))handle_error("pthread_join");return 0;
}void *start_routine1(void *arg){while(1){if(0 != sem_wait(&sem1))handle_error("sem_wait");printf("%s ", (*(ARG *)arg).name);sleep(1);if(0 != sem_post(&sem2))handle_error("sem_post");}
}void *start_routine2(void *arg){while(1){if(0 != sem_wait(&sem2))handle_error("sem_wait");printf("%d\n", (*(ARG *)arg).age);sleep(1);if(0 != sem_post(&sem1))handle_error("sem_post");}
}

线程间通信——信号量相关推荐

  1. linux线程间通信优点,进程间通信与线程间通信【转】

    一个进程写管道:写入字节数小于PIPE_BUF是原子操作,写操作在管道缓冲区没有及时读走时发生阻塞. 一个进程读管道:读操作在管道缓冲区没有数据时发生阻塞. 以前一直想找个机会总结一下进程和线程的通信 ...

  2. Python中的线程间通信

    Python中的线程间通信 文章目录 Python中的线程间通信 1.Queue 2.同步机制 1.Event 2.Semaphore(信号量) 3.Lock(锁) 4.RLock(可重入锁) 5.C ...

  3. Java多线程编程-(4)-线程间通信机制的介绍与使用

    上一篇: Java多线程编程-(1)-线程安全和锁Synchronized概念 Java多线程编程-(2)-可重入锁以及Synchronized的其他基本特性 Java多线程编程-(3)-线程本地Th ...

  4. Unix/Linux IPC及线程间通信总结

    一.互斥与同步 1.互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性.但互斥无法限制访问者对资源的访问顺序,即访问是无序的. 2.同步:是指在互斥的基础上(大多数情况),通过其它 ...

  5. 常用并发工具类(锁和线程间通信工具类)

    常用并发工具类总结 JUC 下的常用并发工具类(锁和线程间通信工具类),主要包括 ReentrantLock.ReentrantReadWriteLock.CountDownLatch.CyclicB ...

  6. 进程间通信线程间通信

    一.多进程: 首先,先来讲一下fork之后,发生了什么事情. 由fork创建的新进程被称为子进程(child process).该函数被调用一次,但返回两次.两次返回的区别是子进程的返回值是0,而父进 ...

  7. Java 多线程(六)——进程间通信与线程间通信

    以前一直想找个机会总结一下进程和线程的通信机制,但由于技术和平台的局限性,一直没有找准切入点.由于马上要毕业了,对自己技术的总结和梳理的前提下写了本篇文章,如有错误之处,敬请拍砖和指教. 操作系统的主 ...

  8. IOT-OS之RT-Thread(六)--- 线程间同步与线程间通信

    文章目录 一.IPC对象管理 1.1 IPC对象控制块 1.2 IPC对象接口函数 二.线程间同步对象管理 2.1 信号量对象管理 2.2 互斥量对象管理 2.3 事件集对象管理 三.线程间通信对象管 ...

  9. 线程和线程间通信(C语言)

            大家好,我是练习编程时长两年半的个人练习生昆工第一ikun,我们昨天说了进程,但是在进行进程切换时,需要不断刷新cache缓存,比较消耗资源为了减少cache刷新时的资源消耗,所以我们 ...

最新文章

  1. 转-Asp.Net MVC及Web API框架配置会碰到的几个问题及解决方案
  2. ICS大作业——程序人生 Hello‘s P2P
  3. Jmeter对HTTP请求压力测试、并发测试的简单使用方法
  4. 【C++基础学习】《C++ Primer》中的“有序型”
  5. lambda表达式对比
  6. 简述直方图和柱形图的区别_如何区分直方图与柱形图
  7. C# 9.0 新功能一览!
  8. python爬虫练习--爬取猫眼top100电影信息
  9. 百度地图开发实例文章(一)
  10. java 解压ygb文件_文件系统-目录项缓存与散列表
  11. 软考 | 软考高项论文该如何去写?
  12. pdf 分形 张济忠_分形
  13. 51单片机实现蜂鸣器报警
  14. F28335学习之ADC配置
  15. java 图片 文字居中_完美实现文字图片水平垂直居中
  16. 包含查询match和对时间进行范围查询range的DSL
  17. Unity 3D模型展示之自由观察模型
  18. 上天入地无所不能的C语言(二)
  19. 获取分时数据,日k数据(A股,港股,美股)
  20. 学生写给老师的一封邮件

热门文章

  1. 移动端页面不需要在meta加_整理一下移动端的一些常用 meta
  2. WRF安装和运行的技术教程
  3. jQuery中replaceWith()与replaceAll()方法
  4. 退役后,他们在抖音找到人生的另一种可能
  5. 现代移动端网络短连接的优化手段总结:请求速度、弱网适应、安全保障
  6. 浅谈Oracle RAC -- OHAS组件
  7. 视频格式转换器哪个好?
  8. abstract方法可以直接调用?
  9. Endnote20下载输出格式
  10. 华西证券:AI领强算力时代,GPU启新场景落地