一个线程同步的问题

ffee 2006-03-20 02:17:45
正在学习操作系统,老师给了一个线程同步的代码,分析了好久了,知道肯定有问题。比如说当一个线程执行到 accnt1 = tmp1 + r 的时候另一个线程如果在此时进入并执行完毕的话就能够退出这个看似死循环的循环。
但问题是,代码执行的结果会有好几种情况,有时候给出两个输出数据,有时候只给出一个输出数据,有时候甚至一个输出数据都不给出。
我只能分析出一种情况。请大家帮帮忙:)
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

int accnt1 = 0;
int accnt2 = 0;

DWORD WINAPI run( LPVOID p) {
int counter=0;
int tmp1, tmp2, r;

do {
tmp1 = accnt1;
tmp2 = accnt2;
r = rand();
accnt1 = tmp1 + r;
accnt2 = tmp2 - r;
counter++;
} while ( accnt1 + accnt2 == 0 );
printf("%d\n", counter);

return 0;
}

int main(int argc, char *argv[])
{
CreateThread(NULL,
0,
run,
NULL,
0,
NULL);

CreateThread(NULL,
0,
run,
NULL,
0,
NULL);


system("PAUSE");
return 0;
}
...全文
458 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
goodluckyxl 2006-04-26
  • 打赏
  • 举报
回复
accnt1 = tmp1 + r;
accnt2 = tmp2 - r;
在汇编层次上是多条语句完成的
并非一个指令在多线程中会被打乱
完全达不到同步的效果
YFY 2006-04-25
  • 打赏
  • 举报
回复
楼主,研究这个问题其实意义不是很大,Windows下线程运行是不完全受控制得,运行顺序是由Windows调度得,知道这个就可以了,输出肯定可以是无数种结果。(输出得值)

设以上为线程1、线程2。

根据运行时续得不确定性,理论上,只要运行时间足够长,肯定会有输出得值,最少输出一个值,最多输出两个值。

一 输出1个值得1种情况

线程1 执行

tmp1 = accnt1;
tmp2 = accnt2;
r = rand();
accnt1 = tmp1 + r;

线程1被挂起
线程2 执行

tmp1 = accnt1;
tmp2 = accnt2;
r = rand();
accnt1 = tmp1 + r;
accnt2 = tmp2 - r;
counter++;
此时线程2就会退出了,线程1会进入无限循环,只有1个值输出。

这只是1种情况,也可能是线程1退出了,线程2进入无限循环。

二 输出2个值得1种情况

线程1 执行

tmp1 = accnt1;
tmp2 = accnt2;
r = rand();
accnt1 = tmp1 + r;

线程1被挂起
线程2 执行

tmp1 = accnt1;(此时accnt1已改变,accnt2尚未改变)
tmp2 = accnt2;
r = rand();
accnt1 = tmp1 + r;

线程2被挂起
线程1执行
accnt2 = tmp2 - r;
counter++;
线程1挂起线程2执行
accnt2 = tmp2 - r;
线程2挂起线程1执行
tmp1 = accnt1;
tmp2 = accnt2;
r = rand();
accnt1 = tmp1 + r;
accnt2 = tmp2 - r;
counter++;

此时线程1和线程2都会退出了,2个值输出。

当然这也只是1种可能得情况。
ffee 2006-03-21
  • 打赏
  • 举报
回复
pgmsoul(pgmsoul):
能帮忙分析一下原因么?
pgmsoul 2006-03-21
  • 打赏
  • 举报
回复
4种输出很正常.
ffee 2006-03-20
  • 打赏
  • 举报
回复
To fixopen(dup):
我知道需要同步一下
现在就是要看看如果不同步的话会出现什么情况,并且对出现的各种情况作出合理的解释。
我的意思是,以上程序在没有加同步的时候,运行后会出现好几种结果(随机的出现),在对运行结果的原因进行分析的时候遇到了困难。
ruodeer 2006-03-20
  • 打赏
  • 举报
回复
把线呈入口函数写两个
run1,run2
然后在两个里面分别操作accnt1 accnt2
记得每执行操作套在Mutex里面

liusujian02 2006-03-20
  • 打赏
  • 举报
回复
以后多研究一下多线程编程!
fixopen 2006-03-20
  • 打赏
  • 举报
回复
你想干吗?

int accnt1 = 0;
int accnt2 = 0;

这两个全局变量的写入要同步一下,如果你不怕脏读,读可以不同步。

3,882

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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