|
发表于 2020-2-21 21:30:01
|
显示全部楼层
TO:lock只保证不会有多个线程同时对某个代码时行写
但不会保证只有一个线程对同个代码进读操作
之所以会出现这种情况,是因为:
public static void Run()
{
lock(thisLock)
{
while (lNum<100)
{
lNum++;
Console.WriteLine("Thread{0}: lNum={1}", Thread.CurrentThread.Name, lNum);
}
}
while循环在lock里面,比如线程1得到线程的互斥权,那么其他线程就无法访问里面的代码:
while (lNum<100)
{}
所以线程1得到互斥权后运行while循环,直到循环到100,才会释放互斥权,当其他线程得到互斥权,运行时发现lNum已经是100了,所以也都退出了..
而如果:
while (count <= 100)
{
mx.WaitOne();
count++;
Debug.WriteLine("thread" + Thread.CurrentThread.Name + ":" + count.ToString());
Thread.Sleep(100);
mx.ReleaseMutex();
}
即while循环在外面,效果就不一样了,在循环内部得到互斥权,自增1前得到互斥权,自增1后释放互斥权,所以每个线程都会有将变量增1的机会..
|
|