线程不同步引出的问题【多个线程同时访问同一资源】
例:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
namespace ThreadLearning
{
public class Program
{
static void Main(string[] args)
{
mythread my = new mythread();
List<string> list = new List<string>();
for (int i = 0; i < 100; i++)
{
list.Add(i.ToString());
}
my.list = list;
Thread nonParameterThread1 = new Thread(new ThreadStart(my.run));
Thread nonParameterThread2 = new Thread(new ThreadStart(my.run));
nonParameterThread1.Start();
nonParameterThread2.Start();
}
}
class mythread
{
public List<string> list { get; set; }
public mythread()
{
}
public void run()
{
while(list.Count!=0)
{
string str=list[0];
Console.WriteLine(str);
if (list[0].Equals(str))
{
list.RemoveAt(0);
}
else
{
Console.WriteLine(str + "不存在");
}
}
}
}
}
解释:时间片的切换导致资源修改的混乱。。。
临界区(Critical Section)
是一段在同一时候只被一个线程进入/执行的代码。
lock (list)
{
while (list.Count != 0)
{
string str = list[0];
Console.WriteLine(str);
if (list[0].Equals(str))
{
list.RemoveAt(0);
}
else
{
Console.WriteLine(str + "不存在");
}
}
}
lock后面只是起到了标记的作用