广告
返回顶部
首页 > 资讯 > 操作系统 >Linux中信号量的示例分析
  • 893
分享到

Linux中信号量的示例分析

2023-06-15 20:06:18 893人浏览 八月长安
摘要

这篇文章给大家分享的是有关linux中信号量的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Linux系统提出了信号量的概念。这是一种相对比较折中的处理方式,它既能保证线程间同步,数据不混乱,又能提高线程

这篇文章给大家分享的是有关linux中信号量的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

Linux系统提出了信号量的概念。这是一种相对比较折中的处理方式,它既能保证线程间同步,数据不混乱,又能提高线程的并发性。注意,这里提到的信号量,与我们所学的信号没有一点关系,就比如Java与javascript没有任何关系一样。

主要应用函数:

  • sem_init函数

  • sem_destroy函数

  • sem_wait函数

  • sem_trywait函数

  • sem_timedwait函数

  • sem_post函数

以上6 个函数的返回值都是:成功返回0, 失败返回-1,同时设置errno。

细心的读者可能留意到,它们没有pthread前缀,这说明信号量不仅可以用在线程间,也可以用在进程间。

sem_t数据类型,其本质仍是结构体。但是类似于文件描述符一样,我们在应用期间可简单将它看作为整数,而忽略实现细节。

使用方法:sem_t sem; 我们约定,信号量sem不能小于0。使用时,注意包含头文件 。

类似于互斥,信号量也有类似加锁和解锁的操作,加锁使用sem_wait函数,解锁使用sem_post函数。这两个函数有如下特性:

  • 调用sem_post时,如果信号量大于0,则信号量减一;

  • 当信号量等于0时,调用sem_post时将造成线程阻塞;

  • 调用sem_post时,将信号量加一,同时唤醒阻塞在信号量上的线程。

上面提到的对线程的加一减一操作,由于sem_t的实现对用户隐藏,所以这两个操作只能通过函数来实现,而不能直接使用++、--符号来操作。

##sem_init函数

  • 函数原型: int sem_init(sem_t *sem, int pshared, unsigned int value);

  • 函数作用: 初始化一个信号量;

  • 参数说明: sem:信号量 ; pshared:取0时,信号量用于线程间同步;取非0(一般为1)时则用于进程间同步; value:指定信号量初值,而信号量的初值,决定了允许同时占用信号量的线程的个数。

##sem_destroy函数

  • 函数原型: int sem_destroy(sem_t *sem);

  • 函数作用: 销毁一个信号量

##sem_wait函数

  • 函数原型: int sem_wait(sem_t *sem);

  • 函数作用: 给信号量值加一

##sem_post函数

  • 函数原型: int sem_post(sem_t *sem);

  • 函数作用: 给信号量值减一

##sem_trywait函数

  • 函数原型: int sem_trywait(sem_t *sem);

  • 函数作用: 尝试对信号量加锁,与pthread_mutex_trylock类似;

##sem_timedwait函数

  • 函数原型: int sem_timedwait(sem_t sem, const struct timespec abs_timeout);

  • 函数作用: 限时尝试对信号量加锁

  • 参数说明: sem:信号量; abs_timeout:与pthread_cond_timedwait一样,采用的是绝对时间。

用法如下(例如超时时间设为1秒):

  • time_t cur = time(NULL);

  • 获取当前时间。 struct timespec t;

  • 定义timespec 结构体变量t t.tv_sec = cur+1;

  • 定时1秒 t.tv_nsec = t.tv_sec +100;

  • sem_timedwait(&sem, &t);

  • 传参

生产者消费者信号量模型:

 #include <stdlib.h> #include <unistd.h> #include <pthread.h> #include <stdio.h> #include <semaphore.h> #define NUM 5                int queue[NUM];                                     //全局数组实现环形队列 sem_t blank_number, product_number;                 //空格子信号量, 产品信号量 void *producer(void *arg) {     int i = 0;     while (1) {         sem_wait(&blank_number);                    //生产者将空格子数--,为0则阻塞等待         queue[i] = rand() % 1000 + 1;               //生产一个产品         printf("----Produce---%d\n", queue[i]);                 sem_post(&product_number);                  //将产品数++         i = (i+1) % NUM;                            //借助下标实现环形         sleep(rand()%3);     } } void *consumer(void *arg) {     int i = 0;     while (1) {         sem_wait(&product_number);                  //消费者将产品数--,为0则阻塞等待         printf("-Consume---%d\n", queue[i]);         queue[i] = 0;                               //消费一个产品          sem_post(&blank_number);                    //消费掉以后,将空格子数++         i = (i+1) % NUM;         sleep(rand()%3);     } } int main(int arGC, char *argv[]) {     pthread_t pid, cid;     sem_init(&blank_number, 0, NUM);                //初始化空格子信号量为5     sem_init(&product_number, 0, 0);                //产品数为0     pthread_create(&pid, NULL, producer, NULL);     pthread_create(&cid, NULL, consumer, NULL);     pthread_join(pid, NULL);     pthread_join(cid, NULL);     sem_destroy(&blank_number);     sem_destroy(&product_number);     return 0; }

运行结果:

Linux中信号量的示例分析

感谢各位的阅读!关于“Linux中信号量的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

--结束END--

本文标题: Linux中信号量的示例分析

本文链接: https://www.lsjlt.com/news/281493.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Linux中信号量的示例分析
    这篇文章给大家分享的是有关Linux中信号量的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Linux系统提出了信号量的概念。这是一种相对比较折中的处理方式,它既能保证线程间同步,数据不混乱,又能提高线程...
    99+
    2023-06-15
  • linux中帐号管理的示例分析
    这篇文章给大家分享的是有关linux中帐号管理的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。/etc/passwd系统帐号信息/etc/shadow帐号密码信息经MD5 32位加密在密码栏前面加『 * ...
    99+
    2023-06-17
  • Java并发编程中Semaphore计数信号量的示例分析
    这篇文章主要为大家展示了“Java并发编程中Semaphore计数信号量的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java并发编程中Semaphore计数信号量的示例分析”这篇文章...
    99+
    2023-05-31
    java semaphore
  • Linux中进程通信的示例分析
    这篇文章将为大家详细讲解有关Linux中进程通信的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数...
    99+
    2023-06-27
  • Linux进程通信的示例分析
    这篇文章主要为大家展示了“Linux进程通信的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Linux进程通信的示例分析”这篇文章吧。linux下的多个进程间的通信机制叫做IPC(,它是...
    99+
    2023-06-28
  • FreeRTOS进阶信号量示例的完全解析
    目录前言1.信号量创建1.1.创建二进制信号量1.2.创建计数信号量1.3创建互斥量1.4创建递归互斥量2.释放信号量2.1 xSemaphoreGive()2.2xSemaphor...
    99+
    2022-11-13
  • python中装饰器信号与槽的示例分析
    这篇文章主要为大家展示了“python中装饰器信号与槽的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“python中装饰器信号与槽的示例分析”这篇文章吧...
    99+
    2022-10-19
  • Linux权限列中加号及点的示例分析
    这篇文章主要介绍了Linux权限列中加号及点的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、综述Linux中,ls -l命令可谓是最常用不过了。命令显示结果中的第...
    99+
    2023-06-27
  • linux中make的示例分析
    小编给大家分享一下linux中make的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!规则规则rule是指示 make 应该如何并且何时构建一个被称作为目...
    99+
    2023-06-16
  • Linux中Base64的示例分析
    这篇文章主要为大家展示了“Linux中Base64的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Linux中Base64的示例分析”这篇文章吧。Base64编码在电子邮件中很常见,Fo...
    99+
    2023-06-27
  • linux中iostat的示例分析
    这篇文章主要介绍linux中iostat的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!iostat主要用于报告中央处理器(CPU)统计信息和整个系统、适配器、tty 设备、磁盘和 CD-ROM 的输入/输出...
    99+
    2023-06-12
  • linux中sudo密码输入时显示星号的示例分析
    这篇文章主要介绍了linux中sudo密码输入时显示星号的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。大家都知道我们在输入linux sudo密码的时候终端是不显示...
    99+
    2023-06-09
  • Rust中变量的示例分析
    这篇文章给大家分享的是有关Rust中变量的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。01 变量和绑定变量指定了某存储单元(Memory Location)的名称,该存...
    99+
    2022-10-19
  • Java中变量的示例分析
    这篇文章将为大家详细讲解有关Java中变量的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。变量概念:1.是内存中的一个存储区域2.该区域有自己的名称(变量名)和类...
    99+
    2022-10-19
  • shell中变量的示例分析
    小编给大家分享一下shell中变量的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1.简介变量是任何一种编程语言都必不可少的组成部分,变量用来存放各种数据...
    99+
    2023-06-09
  • Linux中日志的示例分析
    这篇文章主要介绍Linux中日志的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!日志的三种类型#内核及系统日志:这种日志数据由系统服务rsyslog统一管理,根据其主配置文件/etc/rsyslog.conf...
    99+
    2023-06-27
  • Linux中堆栈的示例分析
    这篇文章给大家分享的是有关Linux中堆栈的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。用下面的程序作为例子:void a() {    &n...
    99+
    2023-06-16
  • Linux IO的示例分析
    这篇文章给大家分享的是有关Linux IO的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。什么是Linux系统Linux是一种免费使用和自由传播的类UNIX操作系统,是一个基于POSIX的多用户、多任务、...
    99+
    2023-06-14
  • Linux中环境变量配置文件的示例分析
    这篇文章主要介绍Linux中环境变量配置文件的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!环境变量是和Shell紧密相关的,用户登录系统后就启动了一个Shell。对于Linux来说一般是bash,但也可以重...
    99+
    2023-06-13
  • Linux C中多线程与volatile变量的示例分析
    这篇文章主要介绍Linux C中多线程与volatile变量的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Linux C中多线程与volatile变量volatile 修饰的变量表示改变量的值是易变的,编译...
    99+
    2023-06-09
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作