两线程 不同步共享数据问题?

ybeetle 2003-03-27 11:44:29
有全局变量 int a;
有两个线程A,B;
两线程同时运行,其中A不断改变a的值,B不断读取a的值。
其中不使用同步,B得到的a的值当然是未知数,
  理论上系统会出错吗?
...全文
129 52 打赏 收藏 转发到动态 举报
写回复
用AI写文章
52 条回复
切换为时间正序
请发表友善的回复…
发表回复
qiufuwang 2003-05-17
  • 打赏
  • 举报
回复
up
wabc 2003-05-17
  • 打赏
  • 举报
回复
在solaris和windows上使用,未出现过错误。

缺页中断应该是在指令执行前发生,可以认为是一个trap

ybeetle 2003-05-14
  • 打赏
  • 举报
回复
只有把程序反编译来看代码,要弄清原子操相当麻烦。
可能只有在可以出少数错误的情况下才能这样用,比如界面显示时可以用。
alphapaopao 2003-05-08
  • 打赏
  • 举报
回复
我认同 mingbao(★情已逝★) 的解释。
接下来,我们来讨论一下操作系统如何实现原子操作的吧。
strongerman 2003-05-07
  • 打赏
  • 举报
回复
up
pason 2003-04-28
  • 打赏
  • 举报
回复
回复niukl:
test::a的地址不是对齐的
pason 2003-04-28
  • 打赏
  • 举报
回复
可以结贴了,zcpro说的很详细了。
alend 2003-04-28
  • 打赏
  • 举报
回复
通过事件同步
mingbao 2003-04-28
  • 打赏
  • 举报
回复
另外,B进程可能会漏收数据或者多次接收同一数据的可能!
mingbao 2003-04-28
  • 打赏
  • 举报
回复
可能会出错,Windows的内存管理采用的是缺页中断机制,也就是说当系统发现程序要访问的数据不在内存中时,会产生一个缺页中断,将存有数据的页面从对换区(外存)调进来。缺页中断不像一般的中断,它在一条指令执行到中间时发生,而一般的中断都不可能在一条指令正在执行时发生,往往要等到一条指令执行结束,再转入中断!
同时, 如果机器指令长度超过一个字节, 内存寻址又允许间接寻址的话, 一条指令在执行期间最多可能产生6 次中断!
blue_fairy 2003-04-28
  • 打赏
  • 举报
回复
这里有这样一个问题,如果B在多处读取a的值,可能会出现问题。比如:
if ( a ) // 此时 a != 0.
strcpy(str_buf, (char*)a); // 此时a 被A线程改成了 0 or unvalid address.
ybeetle 2003-04-27
  • 打赏
  • 举报
回复
我也是这么想的。。。
niukl 2003-04-27
  • 打赏
  • 举报
回复
#pragma pack(push, 1)
struct test
{
char ch;
int a;
};
test::a的地址应该是对齐的
sharp_shooter 2003-04-25
  • 打赏
  • 举报
回复
zcpro 2003-04-25
  • 打赏
  • 举报
回复
一般不会出错,不过可能出现漏读的可能,例如A在一个时间片里连续多次改变该变量。
不过如果该变量的地址没有对齐,我想有可能出错,因为程序要读取内存两次才能取出该变量的值。
例如:
#pragma pack(push, 1)
struct test
{
char ch;
int a;
};

test::a的地址没对齐可能出错。
strongerman 2003-04-25
  • 打赏
  • 举报
回复

我也在写多线程服务器,但我想再大型的应用级别也不会至于每秒钟1000次,也很难想象有一个服务器有这种需求。除非是极端环境 或 极端条件下的科学实验吧:)
pason 2003-04-24
  • 打赏
  • 举报
回复
你可以看一下写数据的那段汇编代码,看写的过程是否就一条汇编语句,如果是的话,应该不会都错。
weijiechen 2003-04-24
  • 打赏
  • 举报
回复
gz
alphapaopao 2003-04-24
  • 打赏
  • 举报
回复
楼上,DWORD在32为机器上,可能是原子操作,在16位机器上理所当然不会是原子操作。
johndotcom 2003-04-24
  • 打赏
  • 举报
回复
LONG InterlockedDecrement(
LONG volatile* lpAddend
);
LONG InterlockedIncrement(
LONG volatile* lpAddend
);
这两个函数是原语操作,由操作系统实现,如果写一个DWORD是原语,那也没有必要
由这两个函数吧?
加载更多回复(32)

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧