在开发过程中,有三个独立执行的程序模块,三个模块都对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使用相关推荐

  1. linux进程间信号量

    linux进程间信号量 Linux 提供的各种系统调用来实现一个具有两种状态的信号量(binary semaphore). 分配和释放 和用于分配.释放共享内存的 shmget 和 shmctl 类似 ...

  2. linux操作系统之信号量、互斥量在进程间的同步、文件锁

    (1)信号量:进化版的互斥量 多个线程间对某个对象的部分数据进行共享,使用互斥锁是没有办法实现的,只能将整个数据对象锁住.这样虽然达到了多线程操作数据共享的目的,却导致线程并发性下降. 信号量:相对折 ...

  3. 使用信号量实现进程间同步

    1.进程a ; 完成信号量的创建和设置: 做定时器,每1s sem_post 信号量一次: 1 #include <stdio.h> 2 #include <fcntl.h> ...

  4. 进程间同步(互斥量、信号量)

    进程间同步可以使用互斥量mutex(互斥锁).信号量和文件锁. 进程间同步使用信号量: int sem_init(sem_t *sem, int pshared, unsigned int value ...

  5. Nginx之进程间的通信机制(信号、信号量、文件锁)

    1. 信号 Nginx 在管理 master 进程和 worker 进程时大量使用了信号.Linux 定义的前 31 个信号是最常用的,Nginx 则通过重定义其中一些信号的处理方法来使用吸纳后,如接 ...

  6. Python 第八篇:异常处理、Socket语法、SocketServer实现多并发、进程和线程、线程锁、GIL、Event、信号量、进程间通讯...

    本节内容: 异常处理.Socket语法.SocketServer实现多并发.进程和线程.线程锁.GIL.Event.信号量.进程间通讯.生产者消费者模型.队列Queue.multiprocess实例 ...

  7. python 进程间同步_python之路29 -- 多进程与进程同步(进程锁、信号量、事件)与进程间的通讯(队列和管道、生产者与消费者模型)与进程池...

    所谓异步是不需要等待被依赖的任务完成,只是通知被依赖的任务要完成什么工作,依赖的任务也立即执行,只要自己完成了整个任务就算完成了.至于被依赖的任务最终是否真正完成,依赖它的任务无法确定,所以它是不可靠 ...

  8. 使用CreateFileMapping来进行进程间的通信和使用信号量来进行同步操作——进程间实现图片传输

    使用共享内存+信号量来进行进程间的通信,实现进程间的图片传输 推荐使用opencv3.x版本,因为opencv4.x就不支持IplImage和Mat类型之间的转换, 有两个进程:图片采集端和图片计算端 ...

  9. linux进程间通信:system V 信号量和共享内存实现进程间同步

    关于信号量和共享内存的相关描述已经在前几篇提到过: 信号量:即内核维护的一个正整数,可以使用内核提供的p/v接口进行该正整数的+/-操作,它主要用来表示系统中可用资源的个数,协调各个进程有序访问资源, ...

最新文章

  1. canal同步mysql到kafka_使用Canal同步MySQL数据到Kafka 得到的数据中sql字段无值-问答-阿里云开发者社区-阿里云...
  2. android界面数据存储,Android应用开发基础之数据存储和界面展现(二)
  3. kivy texture图片格式和opencv numpy图片格式互转
  4. jquery获取select选中的值
  5. 企业实战_08_MyCat 搭建Mysql 一主二从复制环境
  6. 泰禾光电机器人研发_机器之眼 | 3D相机能让机器人看见什么?
  7. css资源网站收集推荐
  8. make 怎么降级_Ubuntu 中将 make 的版本降低
  9. ibm mq的交互命令模式_IBM的完整形式是什么?
  10. springcloud服务发现
  11. Qt on Android 蓝牙通信开发
  12. 对“流形”最好的讲解在维基
  13. Ajax 传参的两种方式
  14. 求生之路 自定义服务器,求生之路2·教你如何自定义绑定快捷键
  15. Twitter无法输入密码
  16. 不同尺寸的手机屏幕其需要图片的分辨率和尺寸
  17. Python调用谷歌翻译接口
  18. 语音备忘录怎么添加录音
  19. excel 根据单元格内容自动调整列宽
  20. uni-app接入阿里图标使用以及图标旋转

热门文章

  1. 一文秒懂图卷积神经网络Graph Convolutional Network(GCN)——从图信号处理(GSP)到图卷积神经网络详细推导
  2. 计算机网络专业学英文嘛,网络域名一般都通俗易懂,大多采用英文名称的缩写来命名。-2020年陕西省专业技术人员继续教育网专业课【计算机网络】练习考试课后测试答案...
  3. 建筑CAD制图软件中如何快速锁定图层?
  4. linux系统怎么设置硬链接,二、Linux系统硬链接和软链接详细介绍与实践
  5. QQ登录报错:redirect uri is illegal(100010)解决方案
  6. cmmi实践访谈测试ppt_计划并实施CMMI_实践篇精选.ppt
  7. Python操作Redis的最佳实践
  8. 动态规划——openjudge7624山区建小学
  9. 1709. 访问日期之间最大的空档期
  10. sisoftware java测试_Super PI及SiSoftware Sandra测试_内存硬盘评测-中关村在线