C语言中信号量:<semaphore.h>头文件

<semaphore.h> 是一个 POSIX 标准定义的头文件,用于提供信号量(semaphore)的接口。信号量是用于线程或进程间同步的一种机制,可以控制访问共享资源的线程数目,广泛应用于多线程和多进程编程。

本文将详细介绍 <semaphore.h> 的数据类型、函数、以及示例。


1. 引入头文件

在使用信号量功能时,必须包含 <semaphore.h>

#include <semaphore.h>

2. 数据类型

sem_t

  • 信号量的主要数据类型。
  • 定义为一个结构体,用于存储信号量的当前值和相关信息。
  • 可以用于进程间或线程间的同步。

3. 函数及用途

以下是 <semaphore.h> 中的主要函数:

(1) 初始化与销毁信号量

函数描述
int sem_init(sem_t *sem, int pshared, unsigned int value);初始化一个信号量。
int sem_destroy(sem_t *sem);销毁一个信号量。
  • sem_init 参数说明
    • sem:指向信号量的指针。
    • pshared
      • 如果为 0,信号量用于线程间同步。
      • 如果为非 0,信号量用于进程间同步(需要位于共享内存中)。
    • value:信号量的初始值(代表资源数目)。
  • 返回值:成功返回 0,失败返回 -1

(2) 信号量操作

函数描述
int sem_wait(sem_t *sem);将信号量的值减 1。如果信号量值为 0,则阻塞直到信号量值大于 0。
int sem_trywait(sem_t *sem);尝试将信号量值减 1。如果信号量值为 0,不阻塞,返回错误。
int sem_post(sem_t *sem);将信号量的值加 1。如果有阻塞的线程,唤醒其中一个线程。
int sem_getvalue(sem_t *sem, int *sval);获取信号量的当前值。

4. 示例

(1) 线程间的同步

以下是一个简单的生产者-消费者问题示例,演示如何使用信号量控制线程同步:

#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>#define BUFFER_SIZE 5int buffer[BUFFER_SIZE];
int count = 0;sem_t empty;  // 表示空位的信号量
sem_t full;   // 表示已占用位的信号量
pthread_mutex_t mutex;  // 保护共享资源的互斥锁void *producer(void *arg) {for (int i = 0; i < 10; i++) {sem_wait(&empty);             // 减少空位pthread_mutex_lock(&mutex);   // 进入临界区buffer[count++] = i;          // 放入数据printf("Produced: %d\n", i);pthread_mutex_unlock(&mutex); // 离开临界区sem_post(&full);              // 增加已占用位sleep(1);}return NULL;
}void *consumer(void *arg) {for (int i = 0; i < 10; i++) {sem_wait(&full);              // 减少已占用位pthread_mutex_lock(&mutex);   // 进入临界区int item = buffer[--count];   // 取出数据printf("Consumed: %d\n", item);pthread_mutex_unlock(&mutex); // 离开临界区sem_post(&empty);             // 增加空位sleep(2);}return NULL;
}int main() {pthread_t prod, cons;sem_init(&empty, 0, BUFFER_SIZE); // 初始化空位信号量sem_init(&full, 0, 0);            // 初始化已占用信号量pthread_mutex_init(&mutex, NULL); // 初始化互斥锁pthread_create(&prod, NULL, producer, NULL);pthread_create(&cons, NULL, consumer, NULL);pthread_join(prod, NULL);pthread_join(cons, NULL);sem_destroy(&empty);              // 销毁信号量sem_destroy(&full);pthread_mutex_destroy(&mutex);    // 销毁互斥锁return 0;
}
输出示例
Produced: 0
Consumed: 0
Produced: 1
Produced: 2
Consumed: 1
Consumed: 2
...

(2) 进程间的同步

信号量也可以在进程间共享,但需要设置 sem_initpshared 参数为非 0,并将信号量存储在共享内存中。


5. 注意事项

  1. 线程间 vs 进程间信号量

    • pshared 为 0 时,信号量用于线程间同步。
    • 为非 0 时,需要将信号量置于共享内存区域,用于进程间同步。
  2. 阻塞与非阻塞操作

    • sem_wait 会阻塞直到信号量值大于 0。
    • sem_trywait 不会阻塞,而是立即返回成功或失败。
  3. 信号量的销毁

    • 在不再需要信号量时,必须调用 sem_destroy 释放资源。
  4. 避免死锁

    • 正确管理信号量和互斥锁的顺序,以避免线程或进程死锁。

6. 总结

<semaphore.h> 提供了信号量相关的功能,适用于多线程或多进程场景下的同步问题。通过使用 sem_t 数据类型及相关函数,开发者可以有效地控制对共享资源的访问,确保线程安全。

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

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

相关文章

Netcat:网络中的瑞士军刀

免责声明&#xff1a;使用本教程或工具&#xff0c;用户必须遵守所有适用的法律和法规&#xff0c;并且用户应自行承担所有风险和责任。 文章目录 一、引言二、简述三、Netcat功能&#xff1f;四、参数选项五、Netcat 的常见功能六、高级用法多连接处理创建简单的代理 七、Netc…

GhostRace: Exploiting and Mitigating Speculative Race Conditions-记录

文章目录 论文背景Spectre-PHT&#xff08;Transient Execution &#xff09;Concurrency BugsSRC/SCUAF和实验条件 流程Creating an Unbounded UAF WindowCrafting Speculative Race ConditionsExploiting Speculative Race Conditions poc修复 论文 https://www.usenix.org/…

Spring Boot 中使用 Mybatis Plus

Spring Boot 中使用 Mybatis Plus 在现代的企业级开发中&#xff0c;MyBatis Plus 是 MyBatis 的增强工具&#xff0c;它简化了很多常见的数据库操作。通过 Spring Boot 集成 MyBatis Plus&#xff0c;可以快速构建高效、简洁的数据库操作层。本文将介绍如何在 Spring Boot 项…

LeetCode:209. 长度最小的子数组(滑动窗口 Java)

目录 209. 长度最小的子数组 题目描述&#xff1a; 实现原理与解析&#xff1a; 滑动窗口 原理思路&#xff1a; 209. 长度最小的子数组 题目描述&#xff1a; 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的…

【SpringBoot 调度任务】

在 Spring Boot 中实现调度任务&#xff08;Scheduled Tasks&#xff09;&#xff0c;通过使用 EnableScheduling 和 Scheduled 注解来完成。 添加依赖启用调度任务支持创建调度任务运行应用程序 添加依赖 pom.xml 文件中有以下依赖项&#xff1a; <dependency><gro…

MyBatis接口绑定的实现方式

MyBatis 提供了几种将 SQL 语句与接口方法绑定的方式&#xff0c;以下是一些常见的实现方式&#xff1a; 1. XML 配置文件方式 这是 MyBatis 最传统的接口绑定方式&#xff0c;通过 XML 配置文件来定义 SQL 语句和接口方法之间的映射关系。 实现步骤&#xff1a; 定义一个 Mapp…

VTK智能指针

文章目录 一、VTK中的New函数二、引用计数三、VTK中的智能指针四、运行时类型识别 一、VTK中的New函数 在 VTK&#xff08;Visualization Toolkit&#xff09;中&#xff0c;New() 函数是创建 VTK 对象的主要方式。它是每个 VTK 类的一个静态方法&#xff0c;专门用于分配和初…

ai绘图丨中国新年春节背景第一弹(附关键词

一、引言 随着春节的临近&#xff0c;节日的氛围愈发浓厚。在电商、社交媒体宣传或者个人创作等诸多场景中&#xff0c;一张精美的中国新年春节背景图都能为作品增色不少。如今&#xff0c;借助 AI 绘图技术&#xff0c;我们能够轻松地创作出独具特色的春节背景图。本文将以 “…

计算机学习

不要只盯着计算机语言学习&#xff0c;你现在已经学习了C语言和Java&#xff0c;暑假又规划学习Python&#xff0c;最后你掌握的就是计算机语言包而已。 2. 建议你找一门想要深挖的语言&#xff0c;沿着这个方向继续往后学习知识就行。计算机语言是学不完的&#xff0c;而未来就…

unique_ptr 智能指针

unique_ptr 智能指针 文章目录 unique_ptr 智能指针std::unique_ptr 的特性初始化转移所有权&#xff08;移动语义&#xff09;访问和修改资源删除器 std::unique_ptr 是 C 标准库中的一部分&#xff0c;位于 <memory> 头文件中。它的“唯一性”&#xff08;unique&#…

鸿蒙项目云捐助第七讲鸿蒙App应用的首页推荐模块布局的实现

鸿蒙项目云捐助第七讲鸿蒙App应用的首页推荐模块布局的实现 最后设置首页的推荐模块&#xff0c;参考模板如下图所示。 一、首页热门推荐模块的实现 对于热门推荐模块&#xff0c;先有上面的小标题栏&#xff0c;这里的标题栏也有一个小图标&#xff0c;首先从“百度图库”中…

NPE的一些理解

什么是 NullPointerException&#xff1f; NullPointerException 是 Java 中的一种运行时异常&#xff0c;表示程序试图对一个 null 对象执行某种操作时发生的错误。例如&#xff0c;访问一个为 null 的对象的方法或属性。 常见导致 NPE 的场景 以下是一些典型会导致 NPE 的…

电子应用设计方案-58:智能沙发系统方案设计

智能沙发系统方案设计 一、引言 智能沙发作为一种融合了舒适与科技的家居产品&#xff0c;旨在为用户提供更加便捷、舒适和个性化的体验。本方案将详细介绍智能沙发系统的设计思路和功能实现。 二、系统概述 1. 系统目标 - 实现多种舒适的姿势调节&#xff0c;满足不同用户的…

【vue-codemirror】Vue中强大的编辑器插件--vue-codemirror

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

Linux下学【MySQL】所有常用类型详解( 配实操图 通俗易懂 )

每日激励&#xff1a;“当你觉得你会幸运时&#xff0c;幸运就会眷顾你&#xff0c;所以努力吧&#xff0c;只要你把事情做好&#xff0c;并觉得你会幸运&#xff0c;你将会变得幸运且充实。” 绪论​&#xff1a; 本章继续学习MySQL的知识&#xff0c;本章主要讲到mysql中的所…

迁移学习中模型训练加速(以mllm模型为例),提速15%以上

根据模型训练过程的显存占用实测的分析,一个1g参数的模型(存储占用4g)训练大约需要20g的显存,其中梯度值占用的显存约一半。博主本意是想实现在迁移学习(冻结部分参数)中模型显存占用的降低,结果不太满意,只能实现训练速度提升,但无法实现显存占用优化。预计是在现有的…

你了解网络层的 ICMP 吗?

你了解网络层的 ICMP 吗&#xff1f; 一. 什么是 ICMP二. ICMP 的工作原理三. ICMP 的结构四. ICMP 的常见应用五. ICMP 的局限性与安全性六. 总结 前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;神…

32.在 Vue 3 中上传 KML 文件并在地图上显示

前言 在现代的地理信息系统&#xff08;GIS&#xff09;应用中&#xff0c;我们经常需要将地理空间数据加载到地图中以供可视化展示。KML&#xff08;Keyhole Markup Language&#xff09;是一种基于 XML 格式的文件格式&#xff0c;广泛用于存储地理信息数据&#xff0c;特别…

uniapp使用百度地图配置了key,但是显示Map key not configured

搞了我两天的一个问题。 hbuilderx版本&#xff1a;4.36 问题介绍&#xff1a; 我的项目是公司的项目&#xff0c;需要在H5端使用百度地图&#xff0c;使用vue-cli创建的uniapp&#xff0c;就是uni代码在src里的目录结构。就是使用这种方式才会遇到这个问题。 问题原因&#xf…

使用cuda12编译时报错block_merge_sort.cuh(169): error: expected a “,“ or “>“

模型的工程化版C程序使用CUDA11.3和11.6编译时没任何错误&#xff0c;为适应高版本的jetpack环境&#xff0c;切换到CUDA12编译时总是报错: /workspace/cuda-12.0/bin/nvcc /workspace/focc/iou3d_nms.cu -c -o ./build/CMakeFiles/bev.dir/src/./bev_generated_iou3d_nms.cu.…