竞态条件

DEMONSINE 2009-05-21 10:22:13

namespace CompletionCondition
{
public class SharedState
{
public int state;
public SharedState(int state)
{
this.state = state;
}
}
public class Program
{
public static void Main()
{
SharedState state = new SharedState(0);
Thread[] thread = new Thread[5];
for (int i = 0; i < 5; i++)
{
thread[i] = new Thread(new ParameterizedThreadStart(ThreadMain));
thread[i].Start(state);
}
for (int i = 0; i < 5; i++)
{
thread[i].Join();
}
Console.WriteLine("Summarized {0}", state.state);
Console.Read();
}
public static void ThreadMain(object o)
{
SharedState state = o as SharedState;
for (int i = 0; i < 10000; i++)
{
state.state++;
}
}
}
}

为什么创建的5个进程同时共用了Main()中创建的SharedState的对象State。 但是为什么没有出现中的竞争呢?
...全文
223 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
aqqwbjgvkgsmq 2009-05-24
  • 打赏
  • 举报
回复

新手,不是很懂。但编译器应该可以做到。

[Quote=引用 10 楼 litaoye 的回复:]
可以优化成这样吗?编译器真得是越来越聪明了,再过两年就会自动将LZ的程序优化成

Console.WriteLine("恭喜您,您的程序中已经出现了竞态");

引用 4 楼 hikaliv 的回复:
我觉得这块代码是这样执行的:

state.state += 10000;

编译器直接这样做了就……
[/Quote]
真相重于对错 2009-05-22
  • 打赏
  • 举报
回复
加两句话
public static void ThreadMain(object o)
{
int rad = rand.Next(11);
Thread.Sleep(rad);
SharedState state = o as SharedState;
for (int i = 0; i < 10000; i++)
{
state.state++;
}
}

绿色夹克衫 2009-05-22
  • 打赏
  • 举报
回复
可以优化成这样吗?编译器真得是越来越聪明了,再过两年就会自动将LZ的程序优化成

Console.WriteLine("恭喜您,您的程序中已经出现了竞态");

[Quote=引用 4 楼 hikaliv 的回复:]
我觉得这块代码是这样执行的:

state.state += 10000;

编译器直接这样做了就……
[/Quote]
光宇广贞 2009-05-21
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 CGabriel 的回复:]
Int32 的 ++ 运算是原子操作, 一万条线程共用也不会出问题

你把类型换为 Int64 到一部纯 32 位的 PC 上运行,可能就会有你想要的东西了
[/Quote]

是原子操作么?
CGabriel 2009-05-21
  • 打赏
  • 举报
回复
Int32 的 ++ 运算是原子操作, 一万条线程共用也不会出问题

你把类型换为 Int64 到一部纯 32 位的 PC 上运行,可能就会有你想要的东西了
aight 2009-05-21
  • 打赏
  • 举报
回复
楼主是想测试下有没有竞争么?
还是...
加个Lock应该就可以的吧。
allahser 2009-05-21
  • 打赏
  • 举报
回复
关注。。。。。
光宇广贞 2009-05-21
  • 打赏
  • 举报
回复
for (int i = 0; i < 10000; i++)
{
state.state++;
}

像这种……

很快就完了……

而新建立一个线程……很慢……

所以……没有争用

况且……

编译器根本不会“傻”到累加一万次……

我觉得这块代码是这样执行的:

state.state += 10000;

编译器直接这样做了就……

所以……你这样测试没有意义……
DEMONSINE 2009-05-21
  • 打赏
  • 举报
回复
如果出现竞态条件的话 输出为Summarized 48000 这个数字不是固定的
如果要避免竞态条件的话 不是要加LOCK的嘛
但是这个还是不会出现
bbb332 2009-05-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 cpio 的回复:]
你想达到什么效果啊?
[/Quote]?
cpio 2009-05-21
  • 打赏
  • 举报
回复
你想达到什么效果啊?

110,499

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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