信号量

BZOJ4318 期望的线性性质 先看一道和这道类似的题目 描述 某一天 WJMZBMR 在打 osu~~~ 但是他太弱逼了,有些地方完全靠运气:( 我们来简化一下这个游戏的规则: 有次点击要做,成功了就是o,失败了就是x,分数是按 comb 计算的,连续a个 comb 就有分,comb 就是极大的连续o。 比如ooxxxxooooxxx,分数就是 Sevenkplus 闲的慌就看他打了一盘,有些地方跟运... 阅读详情
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>

union semun
{
 int val;  
 struct semid_ds  *buf; 
 unsigned short *array;
}sem_union;

static int set_semvalue(void);
static void del_semvalue(void);
static int semaphore_p(void);
static int semaphore_v(void);

static int sem_id;

int main(int argc, char **argv)
{
    int i;
    int pause_time;
    char op_char = 'O';

    srand((unsigned int)getpid());

    sem_id = semget((key_t)1234, 1, 0666 | IPC_CREAT);

    if(argc > 1)
    {
        if(!set_semvalue())
        {
            fprintf(stderr, "Failed to initialize semaphore\n");
            exit(EXIT_FAILURE);
        }
        op_char = 'X';
        sleep(2);
    }

    for(i=0;i<10;i++)
    {
	sleep(2);
        if(!semaphore_p()) exit(EXIT_FAILURE);
        printf("%c", op_char); fflush(stdout);
        pause_time = rand() % 3;
        sleep(pause_time);
        printf("%c", op_char); fflush(stdout);

        if(!semaphore_v()) exit(EXIT_FAILURE);

        pause_time = rand() % 2;
        sleep(pause_time);
    }


    printf("\n%d - finished\n", getpid());

    if(argc > 1)
    {
        sleep(10);
        del_semvalue();
    }

    exit(EXIT_SUCCESS);
    }


static int set_semvalue(void)
{
 //   union semun sem_union;

    sem_union.val = 1;
    if(semctl(sem_id, 0, SETVAL,sem_union) == -1) return 0;
    return 1;
}

static void del_semvalue(void)
{
   // union semun sem_union;

    if(semctl(sem_id, 0, IPC_RMID,sem_union) == -1)
        fprintf(stderr, "Failed to delete semaphore/n");
}


static int semaphore_p(void)
{
    struct sembuf sem_b;

    sem_b.sem_num = 0;
    sem_b.sem_op = -1;
    sem_b.sem_flg = SEM_UNDO;
    if(semop(sem_id, &sem_b, 1) == -1)
    {
        fprintf(stderr, "semaphore_p failed/n");
        return 0;
    }
    return 1;
}


static int semaphore_v(void)
{
    struct sembuf sem_b;

    sem_b.sem_num = 0;
    sem_b.sem_op = 1;
    sem_b.sem_flg = SEM_UNDO;
    if(semop(sem_id, &sem_b, 1) == -1)
    {
        fprintf(stderr, "semaphore_v failed/n");
        return 0;
    }
    return 1;
}


[root@localhost one]# ./sem 1 &
[1] 3195
[root@localhost one]# ./sem
OOXXXXOOOOXXOOXXOOXXOOXXOOXXOOXXOOXXOOX
3196 - finished
[root@localhost one]# X
3195 - finished

int semop(int sem_id, struct sembuf *sem_ops, size_t num_sem_ops);
第一个参数,sem_id,是由semget函数所返回的信号量标识符。第二个参数,sem_ops,是一个指向结构数组的指针,其中的每一个结构至少包含下列成员:
struct sembuf {
    short sem_num;
    short sem_op;
    short sem_flg;
}

第一个成员,sem_num,是信号量数目,通常为0,除非我们正在使用一个信号量数组。sem_op成员是信号量的变化量值。(我们可以以任何量改变信号量值,而不只是1)通常情况下中使用两个值,-1是我们的P操作,用来等待一个信号量变得可用,而+1是我们的V操作,用来通知一个信号量可用。

最后一个成员,sem_flg,通常设置为SEM_UNDO。这会使得操作系统跟踪当前进程对信号量所做的改变,而且如果进程终止而没有释放这个信号量,如果信号量为这个进程所占有,这个标记可以使得操作系统自动释放这个信号量。将sem_flg设置为SEM_UNDO是一个好习惯


SETVAL:用于初始化信号量为一个已知的值。所需要的值作为联合semun的val成员来传递。在信号量第一次使用之前需要设置信号量。
IPC_RMID:当信号量不再需要时用于删除一个信号量标识。

semctl函数依据command参数会返回不同的值。对于SETVAL与IPC_RMID,如果成功则会返回0,否则会返回-1。

原型:void srand(unsigned seed);

用法:srand和rand()配合使用产生伪随机数序列。rand函数在产生随机数前,需要系统提供的生成伪随机数序列的种子,rand根据这个种子的值产生一系列随机数。如果系统提供的种子没有变化,每次调用rand函数生成的伪随机数序列都是一样的。srand(unsigned seed)通过参数seed改变系统提供的种子值,从而可以使得每次调用rand函数生成的伪随机数序列不同,从而实现真正意义上的“随机”。通常可以利用系统时间来改变系统的种子值,即srand(time(NULL)),可以为rand函数提供不同的种子值,进而产生不同的随机数序列



【FreeRTOS】07 二值信号量、计数信号量 本节开始讲freeRTOS的信号量,先从最基本的二值信号量讲起,后面会讲解计数信号量,最后是信号量与临界段保护的区别。 阅读详情

相关推荐

FreeRTOS_信号量之二值信号量

现在使用二值信号量就可以实现这样的功能,任务通过获取信号量来判断是否有网络数据,没有的话就进入阻塞态,而网络中断服务函数(大多数的网络外设都有中断功能,比如 STM32 的 MAC 专用 DMA 中断,通过中断可以判断是否接收到了数据)通过释放信号量来通知任务以太网外设接收到了网络数据,网络任务可以去提取处理了。具体的处理过程做成一个任务,这个任务会获取信号量,如果获取到信号量就说明中断发生了,那么就开始完成相应的处理,这么做的好处就是中断执行的时间非常短。,在这个案例中使用的就是计数型信号量。

light_2025的博客 1550

Pond

2072. 【2016.10.6NOIP普及模拟】Pond  (File IO): input:pond.in output:pond.out 时间限制: 1000 ms  空间限制: 262144 KB  具体限制   Goto ProblemSet 题目描述        G最后在规定时间内完成了任务,Alice只能放行。         出

cdy1206473601的博客 5万+

告别手动配置!用Vector vLinkGen 2.1.0自动生成AUTOSAR链接脚本(附bss段配置详解)

本文详细介绍了如何使用Vector vLinkGen 2.1.0工具自动生成AUTOSAR链接脚本,告别繁琐的手动配置。通过解析vLinkGen的核心架构和bss段配置实践,帮助开发者提升嵌入式软件开发效率,支持多种主流编译器,实现精确的内存分配和初始化策略。

weixin_28716181的博客 379

hdoj1240

Asteroids! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Problem Description You're in space. You want to get home. There are asteroids. You don't w

◆◇丶生如夏花。谁来订阅我的悲伤 904

安卓无障碍服务保活实战:如何用AccessibilityService实现后台常驻(附完整代码)

本文深入解析如何利用Android无障碍服务(AccessibilityService)实现后台服务保活,涵盖多版本系统适配、前台服务集成、开机自启机制等关键技术。通过详细的Kotlin代码示例和合规性指导,帮助开发者构建稳定可靠的后台服务解决方案,同时避免因滥用无障碍服务导致的应用下架风险。

milk5的博客 1073

Colmap中 patchmatch源码

惊世骇俗的Colmap PatchMatch源码 500多行,简明易懂 先了解PatchMatch的options: max_image_size: 任一维度的最大图像尺寸 gpu_index: gpu的下标 depth_min,depth_max: 随机采样的深度范围 window_radius:用于计算NCC(两图片的归一化互相关),NCC的计算需要用到 win_size. 图像匹配 | NCC 归一化互相关损失 | 代码 + 讲解 - 知乎 (zhihu.com) window_step: 用.

qq_24884193的博客 2210

HNU13383:The Big Painting

Problem description Samuel W. E. R. Craft is an artist with a growing reputation. Unfortunately, the paintings he sells do not provide him enough money for his daily expenses plus the new suppl

ACM!荣耀之路! 1万+

把数字化转型真正落到组织里:读懂 SAP 的 OCM 六维框架

摘要: SAP的变革管理框架(OCM)强调数字化转型不仅是技术任务,更需关注组织与人的适应性。OCM包含六大维度:变革战略(明确方向与风险)、变革领导力(统一关键管理者行动)、变革沟通(分层传递信息)、变革实现(细化岗位级影响)、变革赋能(按角色设计培训)和变革有效性(持续评估)。该框架贯穿项目全周期,尤其在云项目中,需从早期规划变革策略,避免后期高代价调整。OCM的核心是将系统设计转化为组织语言,确保业务真正采纳新方式运作。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1435

字符串的复制strcpy的使用以及自实现

strcpy的自实现 #include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) { char firstName[30] = "jim"; char lastName[30] = "Green"; char* p = firstName; char* q = lastName; while (1) { if (*q !

寂蝶难双,窃窃思羽. 4091

LLaMA Factory多卡微调的实战教程(持续更新)

本文主要介绍了LLaMA Factory多卡微调的实战教程(持续更新),希望对学习大语言模型的同学们有所帮助。 文章目录 1. 前言 2. 配置环境 2.1 安装虚拟环境 2.2 安装依赖库 2.3 模型选型与下载 2.4 配置多卡环境 3. 运行代码 3.1 构建训练数据 3.2 修改配置文件 3.3 微调 3.3.1 zero3微调 3.3.2 启动API 3.3.3 模型测试

herosunly的博客 25万+

【测开求职】面试题:计算机网络 详细版整理

本篇文章是笔者为准备研究生复试和校招而写,因此主要针对问答,注重理解,而不在于细节计算。读者可以先查看上面的链接走一遍计算机网络的整体框架结构。其中,重点难点以及易混淆的知识点,笔者会用其他文章进行了详述,在知识点处贴好了链接,有需要的可以查阅。

vector的博客 5937

FreeRTOS 之九 二值信号量、计数信号量、互斥信号量、递归互斥信号量

无论那种操作系统,信号量都是其中重要的一部分。信号量一般用来进行资源管理和任务同步,FreeRTOS 的信号量包括二值信号量、计数信号量、互斥信号量(简称互斥量)和递归互斥信号量(简称递归互斥量),其中互斥量和递归互斥量可以看成特殊的二值信号量。

技术干货 2378

物联网Node-Red开发教程-第6章 HTTP与Web服务

本章摘要(147字): 本章系统讲解了Node-RED中的HTTP节点应用,重点包括: 三大核心HTTP节点功能:http in(接收请求)、http response(返回响应)、http request(调用外部API) 详细演示了REST API开发流程,包括路径参数(req.params)处理和响应构造 提供了创建Hello World API、传感器数据接口等实用示例 涵盖HTTP方法特性、状态码设置及响应头配置等关键知识点 通过流程图和JSON配置直观展示节点连接方式,帮助快速掌握Web服务开发

shihui2003的博客 264

FreeRTOS的信号量

一、信号量简介 信号量是操作系统中重要的一部分,信号量一般用来进行资源管理和任务同步,FreeRTOS中信号量又分为二值信号量、计数型信号量、互斥信号量和递归互斥信号量。不同的信号量其应用场景不同,但有些应用场景是可以互换着使用的。 二、二值信号量 简介 二值信号量其实就是一个只有一个队列项的队列,这个特殊的队列要么是满的,要么是空的。二值信号量通常用于互斥访问或任务同步,二值信号量和互斥信号量非常类似,但是还是有一些细微的差别,互斥信号量拥有优先级继承机制,二值信号量没有优先级继承。因此二值信号另更适

qq_44318582的博客 5633

基于MATLAB的逐次变分模态分解(SVMD)算法详解

本文详细介绍了基于MATLAB的逐次变分模态分解(SVMD)算法。SVMD是一种改进的变分模态分解方法,通过逐次分解机制克服传统VMD算法需要预设模态数量的缺陷。文章从信号分解方法的发展历程入手,阐述了SVMD的核心优势与创新点,包括参数敏感性降低、自适应分解能力和更好的频率分离性能。详细解析了SVMD的数学模型和优化求解过程,重点讨论了变分问题构建、ADMM优化方法和停止准则设计。通过MATLAB代码实现展示了SVMD的具体应用,包括参数初始化、信号预处理、模态提取和残余信号更新等关键步骤。

qq_42212808的博客 131

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

UCOSII-信号量与信号量集

信号量与信号量集在多任务通信中有着十分重要的作用,多任务同步是UCOSII操作系统的基本要求,因此学会信号量以及信号量集的使用对于UCOSII系统学习开发很有帮助,本文详细介绍了信号量及信号量集的原理及使用,供大家参考,谢谢!

tutu_hu的博客 3683

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

信号量——二值信号量

信号量——二值信号量 信号量简介 信号量是操作系统的重要部分,信号量一般用来进行资源管理和任务同步。FreeRTOS中信号量分为二值信号量、互斥信号量、计数信号量和递归互斥信号量,应用场景各不同。 二值信号量 二值信号量简述 二值信号量通常用于互斥访问或同步,二值信号量和互斥信号量非常相似,但互斥信号量有优先级,二值信号量没有。因此二值信号量更适合用于同步,而互斥信号量适用于简单的互斥访问。二...

qq_45796096的博客 4286

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

信号量-内核信号量、POSIX信号量、system V信号量

转载自:http://www.360doc.com/content/12/0824/12/8809247_232067949.shtml 一.什么是信号量 信号量的使用主要是用来保护共享资源,使得资源在一个时刻只有一个进程(线程)所拥有。 信号量的值为正的时候,说明它空闲。所测试的线程可以锁定而使用它。若为0,说明它被占用,测试的线程要进入睡眠队列中,等待被唤醒。   二.信号量的分

hailuoing的专栏 2844

FreeRTOS信号量

这就是二值信号量带来的优先级翻转问题,用户在实际开发中要注意这种问题。

m0_61973119的博客 1528

四种信号量

传送门1、整型信号量2、记录型信号量3、AND型信号量4、信号量集5、信号量实现互斥 说在前:①信号量机制是对具体物理资源的抽象②同类资源的个数用>0的信号量值来表示③0或1的则为临界资源 1、整型信号量 1.1 Dijkstra将其用于表示资源数目S,主要通过P(wait)、V(signal)操作访问。 P操作申请资源 wait((S){ while(S<=0); /判断有无资源 / S- -; } V操作释放资源 signal(S){ S++; } 2、记录型信号

SUGA_的博客 6416

信号量机制

荷兰科学家Dijkstra(狄克斯特拉)提出的一种卓有成效的进程同步机制 1) 整型信号量 *信号量定义为一个整型量; *根据初始情况赋相应的值; *仅能通过两个原子操作来访问。 P操作 wait(S): While S&lt;=0 do no-op; S:=S-1; V操作 signal(S): S:=S+1; 2)记录型信号量 *整型信号量符合“有限等待”原则 signal释放资源后,...

无书清书的博客 7063

Linux POSIX 信号量 命名信号量与未命名信号量

Linux POSIX 信号量 命名信号量与未命名信号量 文章目录Linux POSIX 信号量 命名信号量与未命名信号量命名信号量的创建初始化一个未命名信号量发布信号量和等待信号量获取信号量的当前值关闭一个命名信号量删除一个命名信号量销毁一个未命名信号量 注意: 1、Linux信号量是一个递加递减的正整数,而不是ON、OFF的bool量。 2、Linux信号量数值为0时,尝试去递减该信号量,则会...

huwei039的博客 1903

UCOSIII信号量,互斥信号量

UCOSIII信号量: 信号量:二值信号量(共享资源)       计数信号量(任务同步)·       任务内带信号量(只能用于任务同步,一种计数信号量) 1:二值信号量,计数信号量 //定义信号量 OS_SEM MY_SEM; //创建信号量 OSSemCreate ((OS_SEM* )&MY_SEM,                  (CPU_CHAR*

u013385925的专栏 2816

信号量知识

9.17

m0_63702526的博客 1968

信号量——计数信号量

信号量——计数信号量 计数信号量 计数信号量简介 计数信号量又称为数值信号量,二值信号量相当于长度为1的队列,计数信号量相当于长度大于1的队列。 计数信号量函数 计数信号量创建函数 计数信号量释放和获取函数 计数信号量同二值信号量和互斥信号量函数一样。 实验 要求 程序 #include "sys.h" #include "delay.h" #include "usart.h" #in...

qq_45796096的博客 1890
上一篇: 协同进程
下一篇: 共享存储
onesafe
博客等级 码龄15年 4粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值