线程同步

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

 

posted @ 2023-03-23 21:51  hell__o  阅读(38)  评论(0)    收藏  举报