sem_timedwait_linux 进程间信号量管理程序之sem_timedwait使用
在开发过程中,有三个独立执行的程序模块,三个模块都对sqlite数据库进行读写操作。sqlite在linux共享性较差,所以须要增加相互排斥信号量解决三个模块訪问数据库该问题。
另外,在增加信号量后,信号量sem初始化为1,假设三个模块随意一个在读或写数据库时ctrl+c掉(调试过程须要)。有时会造成信号量sem保持sem_wait后的值,也就是为0。这就造成了死锁。
为了解决上述情况,决定在某一个模块使用sem_timedwait(sem_t *sem,const struct timespec *abs_timeout)函数解决。
abs_timeout指定一个堵塞的时间上限。假设调用因不能马上运行递减而要堵塞。abs_timeout參数指向一个指定绝对超时时刻的结构,这个结果由自
Epoch,1970-01-01 00:00:00 +0000(UTC) 秒数和纳秒数构成。
通过一段时间对sem值的sem_timedwait。假设能使信号量-1,则证明信号量正常。再post该sem信号量。恢复sem。假设累计次数已到,仍然没有一次使信号量-1。则证明sem不正常,也就是为0。须要post该信号量,恢复sem。
详细的实现代码例如以下。此为截取的加入sem_timedwait的部分代码:
int i = 0;
int result;
int k=1;
while(i < 100)
{
struct timespec ts;
struct timeval tt;
gettimeofday(&tt,NULL);
ts.tv_sec = tt.tv_sec;
ts.tv_nsec = tt.tv_usec*1000 + k * 1000 * 1000;
ts.tv_sec += ts.tv_nsec/(1000 * 1000 *1000);
ts.tv_nsec %= (1000 * 1000 *1000);
result=sem_timedwait(sem,&ts);
if(result==0)
{
sem_post(sem);
break;
}
if(result==-1)
{
printf("errno value :%d ,it means %s\n",errno,strerror(errno));
printf("process iiii%d\n",i);
}
i++;
k++;
}
if(i==100)
{
sem_post(sem);
}
printf("sem time wait over\n");
sem_timedwait_linux 进程间信号量管理程序之sem_timedwait使用相关推荐
- linux进程间信号量
linux进程间信号量 Linux 提供的各种系统调用来实现一个具有两种状态的信号量(binary semaphore). 分配和释放 和用于分配.释放共享内存的 shmget 和 shmctl 类似 ...
- linux操作系统之信号量、互斥量在进程间的同步、文件锁
(1)信号量:进化版的互斥量 多个线程间对某个对象的部分数据进行共享,使用互斥锁是没有办法实现的,只能将整个数据对象锁住.这样虽然达到了多线程操作数据共享的目的,却导致线程并发性下降. 信号量:相对折 ...
- 使用信号量实现进程间同步
1.进程a ; 完成信号量的创建和设置: 做定时器,每1s sem_post 信号量一次: 1 #include <stdio.h> 2 #include <fcntl.h> ...
- 进程间同步(互斥量、信号量)
进程间同步可以使用互斥量mutex(互斥锁).信号量和文件锁. 进程间同步使用信号量: int sem_init(sem_t *sem, int pshared, unsigned int value ...
- Nginx之进程间的通信机制(信号、信号量、文件锁)
1. 信号 Nginx 在管理 master 进程和 worker 进程时大量使用了信号.Linux 定义的前 31 个信号是最常用的,Nginx 则通过重定义其中一些信号的处理方法来使用吸纳后,如接 ...
- Python 第八篇:异常处理、Socket语法、SocketServer实现多并发、进程和线程、线程锁、GIL、Event、信号量、进程间通讯...
本节内容: 异常处理.Socket语法.SocketServer实现多并发.进程和线程.线程锁.GIL.Event.信号量.进程间通讯.生产者消费者模型.队列Queue.multiprocess实例 ...
- python 进程间同步_python之路29 -- 多进程与进程同步(进程锁、信号量、事件)与进程间的通讯(队列和管道、生产者与消费者模型)与进程池...
所谓异步是不需要等待被依赖的任务完成,只是通知被依赖的任务要完成什么工作,依赖的任务也立即执行,只要自己完成了整个任务就算完成了.至于被依赖的任务最终是否真正完成,依赖它的任务无法确定,所以它是不可靠 ...
- 使用CreateFileMapping来进行进程间的通信和使用信号量来进行同步操作——进程间实现图片传输
使用共享内存+信号量来进行进程间的通信,实现进程间的图片传输 推荐使用opencv3.x版本,因为opencv4.x就不支持IplImage和Mat类型之间的转换, 有两个进程:图片采集端和图片计算端 ...
- linux进程间通信:system V 信号量和共享内存实现进程间同步
关于信号量和共享内存的相关描述已经在前几篇提到过: 信号量:即内核维护的一个正整数,可以使用内核提供的p/v接口进行该正整数的+/-操作,它主要用来表示系统中可用资源的个数,协调各个进程有序访问资源, ...
最新文章
- canal同步mysql到kafka_使用Canal同步MySQL数据到Kafka 得到的数据中sql字段无值-问答-阿里云开发者社区-阿里云...
- android界面数据存储,Android应用开发基础之数据存储和界面展现(二)
- kivy texture图片格式和opencv numpy图片格式互转
- jquery获取select选中的值
- 企业实战_08_MyCat 搭建Mysql 一主二从复制环境
- 泰禾光电机器人研发_机器之眼 | 3D相机能让机器人看见什么?
- css资源网站收集推荐
- make 怎么降级_Ubuntu 中将 make 的版本降低
- ibm mq的交互命令模式_IBM的完整形式是什么?
- springcloud服务发现
- Qt on Android 蓝牙通信开发
- 对“流形”最好的讲解在维基
- Ajax 传参的两种方式
- 求生之路 自定义服务器,求生之路2·教你如何自定义绑定快捷键
- Twitter无法输入密码
- 不同尺寸的手机屏幕其需要图片的分辨率和尺寸
- Python调用谷歌翻译接口
- 语音备忘录怎么添加录音
- excel 根据单元格内容自动调整列宽
- uni-app接入阿里图标使用以及图标旋转
热门文章
- 一文秒懂图卷积神经网络Graph Convolutional Network(GCN)——从图信号处理(GSP)到图卷积神经网络详细推导
- 计算机网络专业学英文嘛,网络域名一般都通俗易懂,大多采用英文名称的缩写来命名。-2020年陕西省专业技术人员继续教育网专业课【计算机网络】练习考试课后测试答案...
- 建筑CAD制图软件中如何快速锁定图层?
- linux系统怎么设置硬链接,二、Linux系统硬链接和软链接详细介绍与实践
- QQ登录报错:redirect uri is illegal(100010)解决方案
- cmmi实践访谈测试ppt_计划并实施CMMI_实践篇精选.ppt
- Python操作Redis的最佳实践
- 动态规划——openjudge7624山区建小学
- 1709. 访问日期之间最大的空档期
- sisoftware java测试_Super PI及SiSoftware Sandra测试_内存硬盘评测-中关村在线