C语言多线程同步 -- 信号量semaphore.h

2023-05-16

多线程读文件使用fopen,出现BUG,然后寻找同步方法,找到这个“信号量“。

首先需要用sem_init(); 初始化sem_t型变量,并设置初始信号量。比如设置为1.

每次调用sem_wait(sem_t *); 信号量减一,当调用sem_post(sem_t *); 信号量加一。

当信号量为0时,sem_wait(); 函数阻塞,等待信号量 >0 时,才进行。



#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
typedef struct{
	sem_t *lock;
	int num;
}STRUCT;
void test(void * obj)
{
	STRUCT *point = (STRUCT *)obj;
	sem_t *semlock = point->lock;
	sem_wait(semlock);
	FILE *f = fopen("test.txt","a");
	if(f==NULL)
		printf("fopen is wrong\n");
	printf("sem_wait %d\n",point->num);
	int j=0;
	for(j=0;j<30;j++)
	fprintf(f,"%c111111111111\n",'a'+point->num);
	fclose(f);
	sem_post(semlock);

	return;
}


int main()
{
	pthread_t pid[20];  //  pthread_t pid;
	int ret,i=0;
	STRUCT obj[13];
	sem_t semlock;
	if(sem_init(&semlock,0,1)!=0)    // 此处初始信号量设为1. 第二个参数为0表示不应用于其他进程。
		printf("sem_init is wrong\n");
	for(i=0;i<10;i++)
	{
		obj[i].num = i;
		obj[i].lock = &semlock;
		ret = pthread_create(&pid[i],NULL,(void *)test,&obj[i]);
	
		if(ret!=0)
		{
			printf("create thread wrong %d!!\n",i);
			return 0;
		}
		
	}
	for(i=0;i<10;i++)
		pthread_join(pid[i],NULL);  // 等待其他线程结束,如果没有这里,主线程先结束,会释放pid[]及obj[],则出现BUG。 
	return 0;
}

sem_t 是共用体,定义如下。



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言多线程同步 -- 信号量semaphore.h 的相关文章

  • 【JAVA并发】Semaphore:信号量的使用

    一 什么是 Semaphore Semaphore 也叫信号量 xff0c 在 JDK1 5 被引入 xff0c 主要用于在多个线程访问多个共享资源的场景下 xff0c 通过协调各个线程 xff0c 来保证合理的资源访问 例如数量有限的餐厅
  • linux内核设计与实现思想 – C风格的面向对象

    原文链接 linux内核学习 C风格的面向对象 linux内核大量使用面向对象的编码风格 然而linux内核是完全使用C写就 学习他们如何使用C模拟面向对象机制很有意思 这种做法很可能被人贬为扯淡 但是的确使用C模拟面向对象机制 使得程序员
  • Linux共享内存的查看和删除

    使用的总结 1 共享内存查看 命令 ipcs m Shared Memory Segments key shmid owner perms bytes nattch status 0x00000000 1867776 root 600 39
  • C 信号量:sem_wait 抛出莫名其妙的错误

    我正在研究一个必须使用信号量来解决的问题 我有一个包含两个信号量的数组 gsem 并给定某些条件调用sem wait gsem me 它应该等待直到该特定进程被唤醒 但是 由于某种原因它给了我错误Bad file descriptor 我抬
  • C# - 使用 StreamReader 并行化 While 循环会导致 CPU 过高

    SemaphoreSlim sm new SemaphoreSlim 10 using FileStream fileStream File OpenRead using StreamReader streamReader new Stre
  • 了解 posix 进程间信号量

    根据我的理解 信号量应该可以跨相关进程使用 而无需将其放置在共享内存中 如果是这样 为什么下面的代码会死锁 include
  • 在C++中使用线程交替打印奇数和偶数

    使用线程打印奇偶数我遇到了这个问题并想讨论 C 中的解决方案 我能想到使用2个二进制信号量奇数和偶数信号量 偶数信号量初始化为 1 奇数信号量初始化为 0 T1 thread function funOdd wait even print
  • Java中可以使用Semaphore实现阻塞队列吗?

    我想知道是否可以使用Semaphore来实现阻塞队列 在下面的代码中 我使用一个信号量来保护关键部分 并使用另外两个信号量对象来跟踪空槽和已填充对象的数量 public class BlockingQueue private List qu
  • 浴室同步和线程队列

    对于家庭作业 我们被要求解决浴室同步问题 我一直在努力思考如何开始 当一个人进入洗手间 personEnterRestrrom 函数 时我想要做什么 如果他们是女性并且没有男性在他们进入的洗手间里 如果不是 他们会进入等待女性的队列 我想为
  • pthread 和 semaphore 在 osx maverick 10.9 中不适用于我

    我有以下涉及 pthread 和信号量的简单程序 我使用的是 os x Maverick 10 9 我使用 makefile 来编译程序 而不是 xcode 我使用c 11 include
  • Java-允许一个线程更新值,其他线程等待并跳过关键部分

    您好 我遇到一种情况 我必须只允许一个线程更新变量 有一个触发器 它可能会调用多个线程来更新此变量 但是更新应该仅由到达关键部分的第一个线程发生一次 理想情况下 流程应如下所示 线程1 调用 Thread 2 和 Thread 3 来更新由
  • 红宝石信号量?

    我正在研究用 Ruby 实现 Fair Barbershop 问题 这是课堂作业 但我不是在寻找任何讲义 我一直在疯狂地搜索 但我似乎无法找到反映 C 中信号量的 Ruby 实现 我知道有 Mutex 这很棒 单一实现 完全完成了那种信号量
  • 使用 Java 在线程之间传输数据

    我正在编写一个模仿电影院的多线程应用程序 每个参与的人都是自己的线程 并发必须完全由信号量来完成 我遇到的唯一问题是如何基本上链接线程以便它们可以通信 例如通过管道 例如 Customer 1 是一个线程 它获取一个信号量 让它走到票房 现
  • C# 中的互斥量和信号量是什么?我们需要在哪里实施? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 C 中的互斥量和信号量是什么 我们需要在哪里实施 我们如何在多线程中使用它们 您应该从 MSDN 开始 系统 线程 互斥体 http
  • RedHat Enterprise Linux 5.3 及以上版本不正确支持 sem_timedwait?

    我们在使用 pthreadsem timedwait 的 RedHat Enterprise Linux 系统上看到了奇怪的行为 仅 5 3 及以上版本才会出现此情况 当我们使用 sem init 在后台线程上创建信号量时 不会返回错误 当
  • 需要了解SemaphoreSlim的用法

    这是我的代码 但我不明白是什么SemaphoreSlim是在做 async Task WorkerMainAsync SemaphoreSlim ss new SemaphoreSlim 10 List
  • 限制异步任务

    我想运行一堆异步任务 并限制在任何给定时间可以等待完成的任务数量 假设您有 1000 个 URL 并且您只想一次打开 50 个请求 但是 一旦一个请求完成 您就会打开与列表中下一个 URL 的连接 这样 每次始终打开 50 个连接 直到 U
  • Semaphore.wait(timeout: .now()) 的目的是什么?

    看了一些苹果代码示例 我发现了这一点 func metadataOutput output AVCaptureMetadataOutput didOutput metadataObjects AVMetadataObject from co
  • .NET 紧凑框架中的信号量

    不幸的是 使用 NET Compact Framework 时 System Threading 中没有信号量 我不确定为什么会这样 有人有想法吗 经过谷歌搜索后 我发现很多人给出了他们自己的实现 但他们中没有一个真正工作得很好 或者根本没
  • 如何让 UI 线程等待信号量,同时处理其他调度程序请求? (就像 MessageBox.Show 本身所做的那样)

    通常 当 UI 线程调用类似的东西时MessageBox Show 当前代码执行不会继续 直到用户单击 确定 但程序将继续运行在 UI 线程上分派的其他代码 In 这个问题 https stackoverflow com questions

随机推荐

  • Jetson TX2使用记录

    Jetson TX2使用记录 一 配置二 工具1 安装jtop2 安装文件同步工具3 I2C4 ssh5 模块温度 三 自启动1 自启动优化2 自启动设置1 设置WiFi开机自动连接2 设置开机自动登录 用以远程 3 应用软件自启动 3 桌
  • packages.xml分析

    data system packages 1 data system packages list 记录安装app的信息 code com android cts priv ctsshim 10028 0 data user 0 com an
  • PX4项目学习::(四)中间件::通信:uORB

    PX4代码学习系列博客 4 uORB相关 灰信网 xff08 软件开发博客聚合 xff09 freesion com
  • PX4项目学习::(五)项目启动流程(从上电开始)

    PX4的启动流程 初学c语言对RTOS不是很熟悉的同学对main函数都有着不一般的执着 xff0c 阅读代码时总是会去找程序的main函数 xff0c 然后从入口处开始阅读 实际上我们接触的所有软件程序 xff0c 使用到的main函数都不
  • PX4项目学习::(六)项目的配置与编译(Cmake)

    一 简介 在讲解编程之前 xff0c 我得交代两个重要的东西 xff0c 因为这两个东西存在于px4的源码系统当中 xff0c 非常重要 xff0c 它们就是make和Cmake 首先谈谈何为make 熟悉linux系统的朋友对make肯定
  • PX4项目学习::(一)项目架构::软件简明架构

    1 软件构架 PX4软件架构由两个层次组成 xff1a 一是飞行控制栈 flight stack xff0c 即自驾仪的软件解决方案 xff0c 二是中间件 xff0c 一种可以支持任意类型自主机器人的通用机器人中间件 2 1 中间件 中间
  • PX4项目学习::(四)中间件::驱动框架

    驱动框架 PX4的代码库使用一个轻量级的 xff0c 统一的驱动抽象层 xff1a DriverFramework POSIX和 QuRT的驱动写入这个驱动框架当中 旧的NuttX驱动是基于设备 架构的 xff0c 以后将会移植到驱动框架之
  • PX4项目学习::(四)中间件::任务管理与调度

    目录 1 PX4模块运行方式2 PX任务启动方式Task工作队列 参考文献 1 PX4模块运行方式 PX4项目采用两种方式运行 Tasks Work queue tasks Tasks 模块在自己的任务中运行 xff0c 具有自己的堆栈和进
  • PX4项目学习::(五)项目启动流程(纯代码讲解)

    PX4启动流程 xff0c 分为4步 xff1a 1 start xff1a 上电之后程序入口为Firmware NuttX nuttx arch arm src stm32 stm32 start c中的 start函数 xff0c 负责
  • 无人机原理::(一)模型框架与控制系统框架详解

    0 完整框图 1 无人机软件框图 上图为PX4固件框架总览 xff0c 蓝色方块是指飞控系统中的各个模块 下面分别介绍各个模块的作用 xff1a Mavlink模块最为常用 xff0c 可以调整为off board模式以配合机载电脑 xff
  • 基础理论知识

    序 xff1a 综述 机器人专业需要学习什么理论知识 robinvista的博客 CSDN博客 零 基础中的基础 数学 力学 运动学 一 动力学建模与仿真 1 机器人 机器人学基础 蒋志宏 微信读书 2 无人机 全权的两本书 B站有课 3
  • 面试流程总结

    一 HR简单了解情况 xff08 会来了解一般就没啥多说的 xff0c 就是了解下你的意象 xff0c 除非你自己不想去 xff09 二 技术面 一般分两面 xff0c 有些公司急缺人 xff0c 或者一些小公司及其它情况也有可能 面一次
  • 8款设计师常用漂亮的HTML CSS表格样式

    原来的地址 xff1a http www laozuo org 2040 html 我们在布局网站的时候以前都可能直接用TABLE设计 xff0c 如今都更流行使用CSS设计 xff0c 这样对于网站结构更加友好和轻便 下面老左整理的8款设
  • Apollo车辆控制模块::框架与流程

    self drive car 学习笔记 第11课 xff1a 控制理论 鸿 H的博客 CSDN博客 智能驾驶进阶8 控制 次言的博客 CSDN博客 一 框架图 控制输入 xff1a 主要来源于规划模块以及反馈阶段信息 xff08 如loca
  • rt-thread源码分析篇十五:rt_application_init函数分析

    一 rt application init函数调用 二 函数分析 span class token keyword void span span class token function rt application init span s
  • USB 协议整理 八:STM32官方USB库

    https blog csdn net asher zhou article details 105519209 https blog csdn net zcshoucsdn article details 78936456 本章摘取 ST
  • 常用SDK整合

    databuilding SDK官方地址 xff1a https developer android google cn topic libraries data binding
  • 机会留给有准备的人

    通过这次考试 xff0c 发现自己很多不足 xff0c 关上书完全是空白 xff0c 努力吧 xff0c 还有机会
  • 精致代码(C算法——进制问题10-->16)

    xff08 精致算法 xff09 开发思维 十进制转十六进制 蓝桥练习题 xff1a 十进制转十六进制 资源限制 时间限制 xff1a 1 0s 内存限制 xff1a 512 0MB 问题描述 十六进制数是在程序设计时经常要使用到的一种整数
  • C语言多线程同步 -- 信号量semaphore.h

    多线程读文件使用fopen xff0c 出现BUG xff0c 然后寻找同步方法 xff0c 找到这个 信号量 首先需要用sem init 初始化sem t型变量 xff0c 并设置初始信号量 比如设置为1 每次调用sem wait sem