首页 新闻 会员 周边 捐助

关于的线程池小问题

0
悬赏园豆:5 [已解决问题] 解决于 2017-07-13 15:20

public static float money = 0;

public static void Main()
{

ThreadPool.SetMaxThreads(5, 5);
for (int i = 0; i < 5; i++)
{
ThreadPool.QueueUserWorkItem(run, 10);
}
Console.WriteLine(money.ToString());
Console.Read();
}


public static void run(object sal)
{
money += Convert.ToSingle(sal);
}

 

我把任务加到线程池里,按照我的理解就是,我设置到活动状态最大线程数目,然后和循环了5次,money应该都是50,但是执行出来的结果是随机的,还有0的存在,请研究过多线程的同学解释下,谢谢啦

Zarey的主页 Zarey | 初学一级 | 园豆:70
提问于:2017-07-13 14:26
< >
分享
最佳答案
1

你这是多线程共享一个全局变量money,不是原子操作,这个值是随机的,这是正常的,可以用原子变量

收获园豆:5
秋壶冰月 | 大侠五级 |园豆:5903 | 2017-07-13 14:33

啥意思,每太听懂,嘿嘿

Zarey | 园豆:70 (初学一级) | 2017-07-13 14:35

@zhoulei12345: 修改一个变量涉及到两个操作,读取和修改.

假如有两个线程t1 和 t2 ,都执行一次run函数,t1获取money的值为0,t1正准备修改money的值时候,t2获取money的值,这个时候money还为0,t1修改money的值为10,t2修改money+=10,由于获取money的值为0,加等于10,还是为10,线程都结束之后,money的值也就为10了.

 

所有就有了原子操作,还有线程池不要修改线程的大小

 

秋壶冰月 | 园豆:5903 (大侠五级) | 2017-07-13 14:50

@秋壶冰月: 理解了,谢谢

Zarey | 园豆:70 (初学一级) | 2017-07-13 15:20
其他回答(1)
0

你等待了没有

吴瑞祥 | 园豆:29449 (高人七级) | 2017-07-13 14:27

没有的

支持(0) 反对(0) Zarey | 园豆:70 (初学一级) | 2017-07-13 14:29
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册