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的存在,请研究过多线程的同学解释下,谢谢啦
你这是多线程共享一个全局变量money,不是原子操作,这个值是随机的,这是正常的,可以用原子变量
啥意思,每太听懂,嘿嘿
@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了.
所有就有了原子操作,还有线程池不要修改线程的大小
@秋壶冰月: 理解了,谢谢
你等待了没有
没有的