QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1280|回复: 14

思考:共享内存段问题

[复制链接]
发表于 2005-5-24 22:16:09 | 显示全部楼层 |阅读模式
两个进程,一个只写共享内存段,一个只读共享内存段,请问是否需要用信号灯机制

来进行同步.

我的初步想法是不要,大家是怎样看的呢?谢谢!!!
发表于 2005-5-24 23:17:30 | 显示全部楼层
只写是无法实现的,只能用信号灯
光是只读的话,mmap可以指定。
回复

使用道具 举报

发表于 2005-5-25 11:43:25 | 显示全部楼层
到了这一步我真不知如可是好!!我的毕业设计就要交了!大家帮一下我好吗?
出现这样的问题:
我有几个类,三层类,
一层是QWidget
二层是sigcreatedlg.ui产生的sigcreatedlg类
三层是sigcreate
这后就是sigcreate的main.cpp了
我的部件当然在igcreatedlg。cpp中,
涵数实现部分就在三层的sigcreate。cpp中定义,
我一直这样做都没有问题(其它涵数都可以运作)
现在我要做一个SigCreate::paintEvent
在sigcreatedlg.h的
protected slots:加上了下面这个
virtual void paintEvent( QPaintEvent * );
sigcreatedlg.cpp不变,

sigcreate.h中也是在rotected slots:加上了下面这个
virtual void paintEvent( QPaintEvent * );
sigcreate.cpp中加入:
void SigCreate::paintEvent( QPaintEvent * ){
QPainter paint(this);//TabPage_4
paint.setPen( Qt::blue );
paint.drawText( rect(), AlignCenter, "The Text" );
}

编译对过了,(以前做的其功能能运行)


我在QT designer中connect:createButton的clicked() 和this,的paintEvent
但在sigcreatedlg中没有paintEvent这个,我用Edit slot,明明就有paintEvent这个,奇怪!
我就回到sigcreatedlg.cpp中
在connect( cancelButton, SIGNAL( clicked() ), this, SLOT( close() ) );下面加了一行:connect( createButton, SIGNAL( clicked() ), this, SLOT( paintEvent() ) );
编译过了
运行时就出现:QObject::connect: Incompatible sender/receiver argument(sender/receiver的变量出现冲突)

应如何paintEvent()使调用起来??
回复

使用道具 举报

发表于 2005-5-25 19:03:29 | 显示全部楼层
用 semaphore,或者 futex
不进行同步控制肯定是不行的。
回复

使用道具 举报

 楼主| 发表于 2005-5-25 20:50:03 | 显示全部楼层
不过我测试过了,只要不是同时写,就无需同步
回复

使用道具 举报

发表于 2005-5-25 22:03:48 | 显示全部楼层
呵呵,如何证明你的测试是可靠而全面的?
回复

使用道具 举报

 楼主| 发表于 2005-5-26 08:01:46 | 显示全部楼层
测试例子是这样的,两个进程,一个每个一秒更新一次共享内存的值,

一个一秒读出共享内存的值并显示
回复

使用道具 举报

发表于 2005-5-26 08:46:55 | 显示全部楼层
需不需要信号还是要看你的应用需求。

硬件和操作系统中某些操作本身是原子的,那些操作本身
就根本不需要同步。例如:
内存的最小单位是byte,如果你的数据是byte单位,那不
论是同时写还是同时读都不需要同步。

但是,如果你的数据不是原子单位的,例如更新对象是由
8个字节组成的,更新和读取每次都要操作8个字节,那就
绝对需要同步。

像你的例子,如果你的操作数据对象不是原子的数据,那
就可能会发生你写了一半而被操作系统切换到读操作上去
,这时你读出来的数据就是一个“脏”数据。

由于一秒对CPU来说非常长的时间,所以发生写了一半切换
到读的概率非常小,但并不代表不会发生。
回复

使用道具 举报

 楼主| 发表于 2005-5-26 14:58:54 | 显示全部楼层
恩,有道理,收教了
回复

使用道具 举报

 楼主| 发表于 2005-5-26 15:05:57 | 显示全部楼层
刚才又想了想,读一个int型的变量难道不是原子操作吗?32位的,应该是原子操作了,我的CPU

又不是8位的,估计超过4个字节的就不是原子操作了吧?这个问题我想确认,thanks
回复

使用道具 举报

发表于 2005-5-26 15:24:26 | 显示全部楼层
不是读被打断 而是什么时候读被打断
回复

使用道具 举报

 楼主| 发表于 2005-5-26 16:38:50 | 显示全部楼层
说得像绕口令,不懂
回复

使用道具 举报

发表于 2005-5-26 23:05:03 | 显示全部楼层
32bit CPU 对一个 int 的操作应该是原子的,但是,问题在于,对 *p = 2; 这样的操作而言,中途是可以被打断的——它包含了取址、解除引用、赋值、写回内存等一系列动作。中间任意一个位置都可能被打断导致数据的错误。
回复

使用道具 举报

发表于 2005-5-26 23:52:55 | 显示全部楼层
你到原子操作就头晕恶心,能避免我就避免用。
回复

使用道具 举报

 楼主| 发表于 2005-5-27 08:24:48 | 显示全部楼层
同意楼上的楼上的说法,一般内存对齐是4个字节对齐的(当然除非你强制1字节对齐等等),

所以32位取数据应该是原子操作
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-6 00:28 , Processed in 0.038227 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表