230.信号量

news2024/9/9 0:19:12

        信号量是一种用于多线程同步的机制,可以控制对共享资源的访问。信号量的基本概念是使用计数器来控制多个线程对共享资源的访问。信号量可以分为两类:计数信号量(Counting Semaphore)和二进制信号量(Binary Semaphore)。

信号量的基本操作

信号量主要有两个基本操作:P操作(等待,waitdown)和V操作(信号,signalup)。

  • P操作(wait):将信号量的值减1。如果信号量的值为0,则调用线程进入等待状态,直到信号量的值大于0。
  • V操作(signal):将信号量的值加1。如果有线程在等待信号量,则唤醒其中一个线程。

信号量的实现

在POSIX标准的系统(如Linux)中,信号量的API由sem_t类型和相关函数提供。以下是一些常用的函数:

  • sem_init(sem_t *sem, int pshared, unsigned int value):初始化信号量。
  • sem_wait(sem_t *sem):执行P操作。
  • sem_post(sem_t *sem):执行V操作。
  • sem_destroy(sem_t *sem):销毁信号量。
#include <stdio.h>      // 标准输入输出头文件
#include <unistd.h>     // 包含 sleep 函数
#include <semaphore.h>  // 包含信号量函数
#include <stdlib.h>     // 包含标准库函数
#include <time.h>       // 包含时间相关函数
#include <pthread.h>    // 包含线程函数

// 定义两个信号量指针 full 和 empty
sem_t *full;
sem_t *empty;

// 定义一个全局变量 shard_num 用于存储共享数据
int shard_num;

// 生成随机数的函数
int rand_num()
{
    srand(time(NULL));  // 使用当前时间作为种子,确保随机数每次都不同
    return rand();      // 返回一个随机数
}

// 生产者线程函数
void *producer(void *argv)
{
    for (int i = 0; i < 5; i++)  // 生产者循环5次
    {
        sem_wait(empty);  // 等待 empty 信号量,表示有空位可以放数据
        printf("\n==========> 第 %d 轮数据传输 <=========\n\n", i + 1);  // 打印当前传输轮次
        sleep(1);  // 模拟数据传输的延迟
        shard_num = rand_num();  // 生成并存储一个随机数到共享变量 shard_num
        printf("producer has sent data\n");  // 打印生产者发送数据的消息
        sem_post(full);  // 释放 full 信号量,表示有新数据可供消费
    }
    return NULL;  // 线程函数需要返回一个指针类型
}

// 消费者线程函数
void *consumer(void *argv)
{
    for (int i = 0; i < 5; i++)  // 消费者循环5次
    {
        sem_wait(full);  // 等待 full 信号量,表示有新数据可供消费
        printf("consumer has read data\n");  // 打印消费者读取数据的消息
        printf("the shard_num is %d\n", shard_num);  // 打印共享数据 shard_num
        sleep(1);  // 模拟数据处理的延迟
        sem_post(empty);  // 释放 empty 信号量,表示有空位可以放新数据
    }
    return NULL;  // 线程函数需要返回一个指针类型
}

int main()
{
    // 动态分配 full 和 empty 信号量
    full = malloc(sizeof(sem_t));
    empty = malloc(sizeof(sem_t));

    // 初始化信号量,empty 初始值为1,full 初始值为0
    sem_init(empty, 0, 1);
    sem_init(full, 0, 0);

    // 创建生产者和消费者线程
    pthread_t producer_id, consumer_id;
    pthread_create(&producer_id, NULL, producer, NULL);
    pthread_create(&consumer_id, NULL, consumer, NULL);

    // 等待生产者和消费者线程完成
    pthread_join(producer_id, NULL);
    pthread_join(consumer_id, NULL);

    // 销毁信号量
    sem_destroy(empty);
    sem_destroy(full);

    // 释放分配的内存
    free(empty);
    free(full);

    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1958343.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

项目风险管理:从理论到实践的探索

项目风险管理&#xff1a;从理论到实践的探索 前言一、项目风险识别二、项目风险应对策略三、综合应对策略结语 前言 在当今快速变化的商业环境中&#xff0c;项目管理已成为组织实现目标的关键工具。然而&#xff0c;项目的成功往往伴随着各种不确定性和潜在风险。有效的风险管…

JCR一区级 | Matlab实现SO-Transformer-LSTM多变量回归预测(蛇群算法优化)

JCR一区级 | Matlab实现SO-Transformer-LSTM多变量回归预测&#xff08;蛇群算法优化&#xff09; 目录 JCR一区级 | Matlab实现SO-Transformer-LSTM多变量回归预测&#xff08;蛇群算法优化&#xff09;效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.【JCR一区级】M…

Oracle基础-SQL99标准的表连接方法

SELECT * FROM T_NUM CROSS JOIN T_GROUP; --笛卡尔积 ALTER TABLE T_GROUP RENAME COLUMN GID TO ID; --修改字段名 SELECT * FROM T_NUM NATURAL JOIN T_GROUP; --自然连接 会根据两表同名字段或者主外键自动关联 SELECT * FROM T_NUM JOIN T_GROUP USING(ID); --USING连接&…

正余弦算法作者又提出新算法!徒步优化算法(HOA)-2024年一区顶刊新算法-公式原理详解与性能测评 Matlab代码免费获取

声明&#xff1a;文章是从本人公众号中复制而来&#xff0c;因此&#xff0c;想最新最快了解各类智能优化算法及其改进的朋友&#xff0c;可关注我的公众号&#xff1a;强盛机器学习&#xff0c;不定期会有很多免费代码分享~ 目录 原理简介 算法伪代码 性能测评 参考文献 …

oracle语法介绍

Oracle数据库是关系型数据库管理系统之一&#xff0c;其SQL语法遵循标准的SQL规范&#xff0c;但也有一些自己的扩展。以下是一些Oracle SQL语法的基本示例&#xff1a; 1.选择数据&#xff1a; SELECT * FROM my_table; 1.插入数据&#xff1a; INSERT INTO my_table (colum…

Vue 3 中使用 InMap 绘制热力图

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 Vue 3 中使用 InMap 绘制热力图 应用场景介绍 InMap 是一款强大的地图组件库&#xff0c;它提供了一系列丰富的可视化功能&#xff0c;包括热力图。热力图可以将数据点在地图上以颜色编码的方式可视化&#x…

NGINX项目实战

一、nginx四层代理 部署支持4层TCP/UDP代理的Nginx服务器 部署nginx服务器 编译安装必须要使用--with-stream参数开启4层代理模块。 [rootproxy ~]# rm -rf /usr/local/nginx/ #清理环境 [rootproxy nginx-1.16.1]# ./configure --with-http_ssl_module --with-stream #开…

医疗器械产品没有互联网连接,就不适用于网络安全要求吗?

医疗器械产品是否不适用于网络安全要求&#xff0c;需要考虑产品是否具有网络连接功能以进行电子数据交换或远程控制&#xff0c;以及是否采用储存媒介进行电子数据交换。详细解析如下&#xff1a; 一、医疗器械的网络安全要求不仅限于互联网连接 数据交换接口&#xff1a;医疗…

这才是 PHP 高性能框架 Workerman 的立命之本

大家好&#xff0c;我是码农先森。 在这个大家都崇尚高性能的时代&#xff0c;程序员的谈笑间句句都离不开高性能&#xff0c;仿佛嘴角边不挂着「高性能」三个字都会显得自己很 Low&#xff0c;其中众所皆知的 Nginx 就是高性能的代表。有些朋友可能连什么是高性能都不一定理解…

【SPIE独立出版:高录用、快检索】第四届通信、网络与物联网国际学术会议 (CNIoT 2024,8月30-9月1)

为了促进通信、计算机和控制等领域专家学者跨界交流与合作&#xff0c;打造最前沿的交流平台&#xff0c;第四届通信、网络与物联网国际学术会议 (CNIoT 2024&#xff09;将涉及通信、网络、物联网、IT能量感知技术、人工智能应用等领域。 会议将为专注于该研究领域的国内外优秀…

一键切换阿里yum源(包括其他系统repo镜像查找方法)

一键切换阿里yum源 示例命令其他系统repo镜像GitHub文档 示例命令 # 备份旧源 mv CentOS-Base.repo CentOS-Base.repo.bak # 添加新源(阿里镜像源) wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo其他系统repo镜像 这里的示例是用…

RT-DETR:DETRs Beat YOLOs on Real-time Object Detection (CVPR2024)

DETRs Beat YOLOs on Real-time Object Detection 论文链接&#xff1a;http://arxiv.org/abs/2304.08069 代码链接&#xff1a;https://github.com/lyuwenyu/RT-DETR https://github.com/ultralytics/ultralytics/tree/main/ultralytics/models/rtdetr&#xff08;已集成到Y…

2024.7.29 作业

1> 写一个日志文件&#xff0c;将程序启动后&#xff0c;每一秒的时间写入到文件中 #include <myhead.h> int main(int argc,const char *argv[]) {FILE *fp NULL;if((fpfopen("./log.txt","r"))NULL) {perror("open error1");return…

使用 Python 实现计算交并比(IoU)的代码示例:

两个矩形框的交集/并集 IOU(A)/(ABC) box_areas(box[2]-box[0])*(box[3]-box[1])boxes_areas(box[:,2]-box[:,0])*(box[:,3]-box[:,1])l_xtorch.maximum(box[0],boxes[:,0])l_ytorch.maximum(box[1],boxes[:,1])r_xtorch.minimum(box[2],boxes[:2])r_ytorch.minimum(box[3],box…

SpringCloud+Vue3主子表插入数据(芋道)

目的&#xff1a;多表联查获取到每个班级里面所有的学生上课的信息。点击消课插入到消课主表和消课子表&#xff0c;主表记录班级信息&#xff0c;消课人员信息&#xff0c;上课时间。子表记录上课学员的信息&#xff0c;学员姓名、手机号、班级名称、班级类型、上课时间、老师…

7月29(信息差)

&#x1f30d;最强模型 Llama 3.1 如期而至&#xff01;扎克伯格最新访谈&#xff1a;Llama 会成为 AI 界的 Linux &#x1f384;谷歌AlphaProof攻克国际奥赛数学题 https://www.51cto.com/article/793632.html ✨SearchGPT第一波评测来了&#xff01;响应速度超快还没广告&…

微信小程序开发 快速学习 这篇就够了

目录 一、配置篇 &#xff08;1&#xff09;官网链接&#xff1a; &#xff08;2&#xff09;项目分析 &#xff08;3&#xff09;调试器 &#xff08;4&#xff09;预览体验 &#xff08;5&#xff09;配置文件 &#xff08;6&#xff09;配置pages &#xff08;7&…

Android Framework 之AMS

它管理了系统的四大组件:Activity、Service、ContentProvider、Broadcast。 它除了管理四大组件外&#xff0c;同时也负责管理和调度所有的进程 AMS相关目录结构 AMS代码主要在下面几个目录(AndroidQ上AMS相关部分功能移到了wm下)&#xff1a; frameworks/base/core/java/andro…

微信小游戏之三消(三)道具相关方法

设计一个 game class。负责了游戏的核心控制逻辑&#xff0c;包括游戏状态管理、方块和道具的生成与效果处理&#xff0c;以及游戏的重新开始和复活流程。通过这些方法&#xff0c;脚本实现了游戏的基本玩法和用户交互。 主要游戏控制方法 gameStart()&#xff1a;开始游戏&am…

攻防世界 re 新手模式 2

IgniteMe 32位无壳 一些简单信息&#xff0c;看关键函数 可以得到v7[i]的值 比较简单的逆向 #include<stdio.h> #include<string.h> int main() {char flag[40];char s[40];char str[]"GONDPHyGjPEKruv{{pj]XrF";char ch[] {0x0D, 0x13, 0x17, 0x11,…