当前位置:  技术问答>linux和unix

linux下多进程访问共享内存队列同步的问题

    来源: 互联网  发布时间:2017-01-13

    本文导语:  1.我要做的是多进程间同步一个共享内存队列,控制同步用的是信号量。 2.队列封装到一个类里。只对外提供三个接口:init push pop。同步的过程对外完全透明。 3.为了保证 信号量的初始值不会在多进程并发执行的...

1.我要做的是多进程间同步一个共享内存队列,控制同步用的是信号量。
2.队列封装到一个类里。只对外提供三个接口:init push pop。同步的过程对外完全透明。
3.为了保证 信号量的初始值不会在多进程并发执行的情况下被弄乱,并且必须保证其在多个进程间只被初始化一次。并且初始化完之后,才进行semop 操作。
4.为了保证第三点,我想用一个互斥量。
5.为了这个互斥量能够在多进程间共享,在另外一块共享内存里动态分配, 分配之后要设置PTHREAD_PROCESS_SHARED属性。

现在的问题是:设置PTHREAD_PROCESS_SHARED属性 的操作在多进程间是并发执行的,怎么保证这个互斥量只被初始化一次?


或者有没其他更好的方法保证信号量的初始值在多个进程间只被初始化一次?


|


直接看网络编程卷2的sem章节,semget IPC_CREAT|IPC_EXCL|MODE创建,如果失败则说明信号量已创建,那么调用semget直接打开信号量,然后调用semctl用IPC_STAT获取ds,看ds.sem_otime是否为0,该函数只有在sem_op调用成功之后才设置为非0,所以该进程轮询等待ds.sem_otime!=0就可以开始使用了。

也就是谁创建谁初始化,是否初始化完成是由创建者semctl初始化之后semop调用一次来指示的。

其实类似的办法很多,你也可以创建信号量时候,给MODE加个没有用的权限,比如S_IXOTH, 就是给其他用户执行权限。 那么其他进程发现信号量已存在,于是直接打开,并且semctl IPC_STAT去检查ds.perm里的mode是否有S_IXOTH,如果有就继续等待,直到创建进程semctl SET取消这个S_IXOTH为止。

其实POSXI的各种IPC都可以借助我说的这种权限位的方法实现。

|


还有,楼主的设计其实我不太赞同,你完全可以互斥量+条件变量+元素个数+共享内存+循环队列。

根本不需要system v的信号量。

元素个数为0,则get阻塞在cond_wait。
元素个数满,则put阻塞在cond_wait上。

get的时候,如果元素个数满,则cond_signal。
put的时候,如果元素个数0,则cond_signal。

再牛逼一点,加一个等待读计数,等待写计数。

如果put发现元素个数满,那么等待写+1.
如果get发现元素个数0,则等待读+1.

借助计数,可以优化这个队列为读优先或者写优先。

甚至,这样做,我们可以提供非阻塞get/put接口,这是什么档次。

    
 
 

您可能感兴趣的文章:

  • linux 消息队列长度的问题
  • linux下消息队列不阻塞
  • LINUX如何调整POSIX消息队列大小
  • Linux消息队列编程问题?
  • linux 两个不同的key生成同样的消息队列ID?
  • Linux下使用C++互斥访问文件+消息队列
  • 大家好,linux内核中等待队列如何使用?哪儿有这些资料?谢谢各位
  • linux下编程显示所有进程,消息队列,急!!!!!!!!!!
  • linux C 语言 多线程读写消息队列
  • linux下 消息队列 超有难度问题
  • 高分求救!linux中两个应用程序之间可以用基于system v的消息队列进行通讯吗?
  • linux消息队列,读而不删怎么弄?
  • linux不同机器间的进程如何共享一个消息队列,并由此互相通信?
  • linux消息队列的问题
  • linux多线程怎么实现等待队列
  • unix/linux平台下进程间通信的问题(消息队列)(紧急求助)
  • linux的IPC消息队列几个简单问题~~~
  • linux如何主动将线程放入到线程调度队列中重新排队?
  • 在LINUX下用C编程有可以直接使用的“队列”数据结构吗?
  • linux中mq_open函数创建的消息队列在哪里
  • linux僵尸(zombie)进程介绍及清除
  • 高手请教!linux怎样通过pid获取进程信息,如:进程名、进程状态等?
  • linux下进程占用内存空间详解
  • linux命令如何实现重启父进程而不会使其子进程退出
  • Linux进程的内核栈和用户栈概念,相互关系及切换过程
  • Linux中最多同时可以开多少个进程,一个进程可以开多少个线程?
  • linux下进程间通信:共享内存原理及具体用法举例(基于c/c++语言)
  • Linux守护进程 的子进程 终端处理
  • Linux内核进程与应用进程的通信方式有哪些?
  • 在linux,如何用共享内存来实现进程间的通讯?(这些进程没有父子关系)
  • linux下system函数调用shell命令后,怎样让主进程不等子进程返回,接着执行(在线)?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Linux下时钟同步问题:Clock skew detected原因分析及解决方法
  • linux时钟为何与BIOS时钟不同步?如何使其同步?
  • Linux下用ntpdate同步时间及date显示设置时间
  • linux虚拟机时间与windows时间如何同步
  • linux服务器之间如何实现时间同步?
  • 送分:LINUX 下如何实现双机的备份和同步?
  • linux中同步与原子操作的相关知识辨析【请教高手】
  • linux下的同步问题
  • window系统的东东如何及时同步到linux系统上?
  • 老板要用linux服务器共享一些CAD文件,并且要同步更新,linux有这功能吗?
  • linux 多线程sys_read同步问题
  • samba性能配置问题:linux和window如何能保持同步
  • linux管道问题,管道建立后如何同步?
  • 关于Linux下线程同步的小疑问
  • linux 如何实现两台服务器文件的同步?
  • 谁能给一个linux/unix下多线程同步的例子
  • 多台linux服务器,如何同步用户名和密码?
  • 如何在LINUX实现同步录音和放音
  • 请教:如何把一台Linux机器设置为时间同步服务器
  • linux下进程同步有mutex吗?
  • linux 下,实时同步两台机器上的数据用什么技术好?
  • linux c/c++ IP字符串转换成可比较大小的数字
  • 在win分区上安装linux和独立分区安装linux有什么区别?可以同时安装吗?(两个linux系统)
  • linux哪个版本好?linux操作系统版本详细介绍及选择方案推荐
  • 在虚拟机上安装的linux上,能像真的linux系统一样开发linux程序么?
  • secureCRT下Linux终端汉字乱码解决方法
  • IP地址数字互转 iis7站长之家
  • Linux c字符串中不可打印字符转换成16进制
  • 安装vmware软件,不用再安装linux系统,就可以模拟linux系统了,然后可以在其上学习一下LINUX下的基本操作 了?
  • Linux常用命令介绍:更改所属用户群组或档案属性
  • 红旗Linux主机可以通过127.0.0.1访问,但如何是连网的Win2000机器通过Linux的IP去访问Linux


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3