LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1279|回复: 7

互斥的实现

[复制链接]
发表于 2007-10-4 03:19:47 | 显示全部楼层 |阅读模式
我曾经在windows下用masm实现互斥,很简单,因为所有操作是针对寄存器的,在CPU的最小时间片中只用xchg来达到互斥,主要代码如下:
db i;//定义一个字节,用来做互斥边界触点
mov al,1;//寄存器al为1
xchg al,i;//把i和al交换,这条命令是机器一个时间片就能完成的,在这个时间片内,机器不会执行任何其它代码
test al,1;//测试是否是1,是1则已经被锁,不是1则被当前代码锁定了,因为i已经是1了
jz 锁定
通过判断i的值,可以对其它需要保护的数据进行单线访问,我感觉很容易实现,可到linux下,好象不同的机器(x86,sparc....),C对汇编的支持不一样?不知道能不能象上面那样实现一个
我是两进程(不是线程)间的共享数据的写权限互斥问题,怀疑mute不能用于多进程,我该怎么做
不知道我说清楚没有,希望有兴趣的朋友说两句
发表于 2007-10-5 09:16:17 | 显示全部楼层
pthread mutex
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-10-7 22:02:42 | 显示全部楼层
这个是不行的,它只能是同进程不同线程间的应用,好象信号semget...可以实现,正在查看。。。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-10-7 22:28:40 | 显示全部楼层
另外对于原子操作的定义有些不明:
i=0;
这个操作可以看作原子操作吧,
但汇编来写的话,它应该有:
1     mov eax,0 或  xor eax,eax
2     mov i,eax
这不机器能执行的两个操作命令,应该是机器的一个时间片,两条命令中间会不会有中断的可能。
主要还是对原子操作的定认不清楚啊
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-10-7 22:52:05 | 显示全部楼层
看了一下/usr/src/kernels/2.6.22.4-65.fc7-x86_64/include/asm/atomic.h
对原子操作有了一定的了解,有待深入
回复 支持 反对

使用道具 举报

发表于 2007-10-8 02:31:20 | 显示全部楼层
互斥的形式很多
取决于critical section的长短
内核里atomic类型只适用于访问单个变量时的互斥
回复 支持 反对

使用道具 举报

发表于 2007-10-15 17:11:30 | 显示全部楼层
用 pthread_mutexattr_setpshared()  设定属性 PTHREAD_PROCESS_SHARED,

可以让 mutex 在进程间共享. 当然你得把 mutex 放在 shared memory 里面.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-10-19 12:35:46 | 显示全部楼层
还是高手说的实,谢谢
回复 支持 反对

使用道具 举报

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

本版积分规则

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