正在阅读:c#多线程教学(5):Case 学习多线程c#多线程教学(5):Case 学习多线程

2005-07-13 10:22 出处: 作者:c-sharpcorner 责任编辑:moningfeng

  下面我将使用ManualResetEvent来解决上面遇到的问题来达到线成的同步,唯一不同的是我们在启动读线程和写线程之前使用安全的方法。

Thread t0 = new Thread(new ThreadStart(SafeWriteThread));

Thread t1 = new Thread(new ThreadStart(SafeReadThread10));

Thread t2 = new Thread(new ThreadStart(SafeReadThread20));

t0.IsBackground=true;

t1.IsBackground=true;

t2.IsBackground=true;

t0.Start();

t1.Start();

t2.Start();



  添加一个ManualResetEvent:

m_mre = new ManualResetEvent(false);


  看看SafeWriteThread的代码:

public void SafeWriteThread()
{
m_mre.Reset();
WriteThread();
m_mre.Set();
}



  Reset设置ManualResetEvent的状态为non-signaled,这意味着事件没有发生。接着我们来调用WriteThread方法,实际上可以跳过Reset这一步,因为我们在ManualResetEvent的构造函数设置其状态为non-signaled。一旦WriteThread线程返回,调用Set方法设置ManualResetEvent的状态为signaled。

  下面让我们来看看另外两个SafeReadThread方法:

public void SafeReadThread10()
{
m_mre.WaitOne();
ReadThread10();
}
public void SafeReadThread20()
{
m_mre.WaitOne();
ReadThread20();
}



  WaitOne方法将阻塞当前的线程直到ManualResetEvent的状态被设置为signaled。在这里,我们程序中的两个读线程都将阻塞至SafeWriteThread完成任务后调用Set方法。这样我们就确保了两个读线程在写线程完成对共享资源的访问之后才执行。


Case 3 - Synchronization [Many WriteThreads - Many ReadThreads]

  下面我们将模拟更为复杂的情形。在下面的程序中,有多个写线程和读线程。读线程只有在所有的写线程完成了任务之后才能访问共享资源。在实际的情况中,读线程可能是并行的运行,但是为了简便起见,我使写线程运行有一定的顺序,只有在前一个写线程完成之后,第二个写线程才能启动。
键盘也能翻页,试试“← →”键

关注我们

最新资讯离线随时看 聊天吐槽赢奖品