线程同步
Mutex介绍: https://learn.microsoft.com/zh-cn/dotnet/api/system.threading.mutex?view=net-6.0
AutoRestEvent ManulReset: 摘自https://www.cnblogs.com/zhan520g/p/11388591.html
#region *************** ManualResetEvent ***************
//*************** ManualResetEvent ***************
//WaitOne();阻塞当前线程
//Set();继续
//Reset();使下次又遇到waitone 又进行阻塞,使事件重新有作用
ManualResetEvent manualodd = new ManualResetEvent(false);
ManualResetEvent manualeven = new ManualResetEvent(false);
private void btnManulResetEvent_Click(object sender, EventArgs e)
{
Task task1 = Task.Run(outodd);
Task task2 = Task.Run(outeven);
}
private void outeven()
{
while (true)
{
Thread.Sleep(10);
manualeven.WaitOne();
if (count % 2 == 1 && count < 100)
{
Console.WriteLine("even:" + count);
count++;
}
manualodd.Set();
manualodd.Reset();
}
}
int count = 0;
private void outodd()
{
while (true)
{
Thread.Sleep(10);
if (count % 2 == 0 && count < 100)
{
Console.WriteLine("odd:" + count);
count++;
}
manualeven.Set();
manualeven.Reset();
manualodd.WaitOne();
}
}
#endregion
#region *************** AutoResetEvent ***************
// AutoResetEvent Set之后自动复位,下次遇到waitone进行阻塞
AutoResetEvent autooddReset = new AutoResetEvent(false);//初始状态 false :事件生效,true,使事件终止,第一次遇到waitone不会阻塞
AutoResetEvent autoevenReset = new AutoResetEvent(false);
private void btnAutoResetEvent_Click(object sender, EventArgs e)
{
count = 0;
Task task1 = Task.Run(outoddauto);
Task task2 = Task.Run(outevenauto);
}
private void outevenauto()
{
while (true)
{
Thread.Sleep(10);
autoevenReset.WaitOne();
if (count % 2 == 1 && count < 100)
{
Console.WriteLine("even:" + count);
count++;
}
autooddReset.Set();
}
}
private void outoddauto()
{
while (true)
{
Thread.Sleep(10);
if (count % 2 == 0 && count < 100)
{
Console.WriteLine("odd:" + count);
count++;
}
autoevenReset.Set();
autooddReset.WaitOne();
Console.WriteLine("odd:" );
}
#endregion
#region *************** AutoResetEvent WaitOne(100) ***************
private void btnAutoResetEvent1_Click(object sender, EventArgs e)
{
count = 0;
Task task1 = Task.Run(outoddauto2);
}
private void outoddauto2()
{
while (true)
{
Thread.Sleep(10);
if (count % 2 == 0 && count < 100)
{
Console.WriteLine("odd:" + count);
count++;
}
autooddReset.WaitOne(100);//阻塞1000ms等不到,继续运行
Console.WriteLine("odd:");
}
}
#endregion
#region *************** Mutex ***************
//使用本地 Mutex 对象同步对受保护资源的访问。 由于每个调用线程被阻止,直到它获取互斥体的所有权,因此它必须调用 ReleaseMutex 方法来释放互斥体的所有权。
//拥有互斥体的线程可以在重复调用 WaitOne 中请求相同的互斥体,而不会阻止其执行。 但是,线程必须调用 ReleaseMutex 相同次数的方法才能释放互斥体的所有权。
//Mutex的释放与锁定 都只能在同一个线程中执行
Mutex mutex =new Mutex(false);
private void btnMutex_Click(object sender, EventArgs e)
{
count = 0;
Task task1 = Task.Run(outmutex);
Task task2 = Task.Run(outmutex);
}
private void outmutex()
{
while (true)
{
mutex.WaitOne();//申请互斥体,
Thread.Sleep(10);
if (count % 2 == 1 && count < 100)
{
Console.WriteLine("even:" + count+"Thread:"+Thread.CurrentThread.ManagedThreadId);
count++;
}
else
{
if (count % 2 == 0 && count < 100)
{
Console.WriteLine("odd:" + count + "Thread:" + Thread.CurrentThread.ManagedThreadId);
count++;
}
}
mutex.ReleaseMutex();//释放互斥体
}
}
#endregion
#region *************** lock ***************
public static readonly object lockobj=new object();
private void btnLock_Click(object sender, EventArgs e)
{
count = 0;
Task task1 = Task.Run(outlock);
Task task2 = Task.Run(outlock);
}
private void outlock()
{
while (true)
{
lock (lockobj)
{
Thread.Sleep(10);
if (count % 2 == 1 && count < 100)
{
Console.WriteLine("even:" + count + "Thread:" + Thread.CurrentThread.ManagedThreadId);
count++;
}
else
{
if (count % 2 == 0 && count < 100)
{
Console.WriteLine("odd:" + count + "Thread:" + Thread.CurrentThread.ManagedThreadId);
count++;
}
}
}
}
}
#endregion

浙公网安备 33010602011771号