當多個進程分享數據的時候,對某段程序代碼要lock(當對分享數據進行改寫的時候)。
我們先看些這段代碼:
namespace ThreadTest
{
class Program
{
static bool done;
static void Main(string[] args)
{
new Thread(Go).Start();
Go();
Console.ReadKey();
}
static void Go()
{
if (!done)
{
done = true;
Console.WriteLine("Done");
}
}
}
}
字段“Done”是兩個進程分享的,所以結果輸出一個“Done”;但是我們如果把兩句程序顛倒一下:
static void Go()
{
if (!done)
{
Console.WriteLine("Done");
done = true;
}
}
一個進程還沒來得及把"done"設置為true的時候,另一個進程可能已經輸出了,這就大大的加大了輸出兩個Done的可能性。
所以,我們需要lock,當給共享變量賦值的時候,可以給程序鎖住,這樣另一個進程就只能等待,直到lock解除。
static bool done;
static readonly object locker = new object();
static void Main(string[] args)
{
new Thread(Go).Start();
Go();
Console.ReadKey();
}
static void Go()
{
lock(locker)
{
if (!done)
{
Console.WriteLine("Done");
done = true;
}
}
}