C#读写者线程(用AutoResetEvent实现同步)

晨曦之光 发布于 2012/03/09 14:15
阅读 215
收藏 0

 本博客(http://blog.csdn.net/livelylittlefish)贴出作者(三二一、小鱼)相关研究、学习内容所做的笔记,欢迎广大朋友指正!

 

C#读写者线程(用AutoResetEvent实现同步)

 

最近研究C#中的多线程问题,查看了不少学习资料,自己也写一个用AutoResetEvent实现同步的读写者线程。

 

1. AutoResetEvent简介

 

通知正在等待的线程已发生事件。无法继承此类。

AutoResetEvent(bool initialState):构造函数,用一个指示是否将初始状态设置为终止的布尔值初始化该类的新实例。

public bool Reset ():将事件状态设置为非终止状态,导致线程阻止;如果该操作成功,则返回true;否则,返回false。

public bool Set ():将事件状态设置为终止状态,允许一个或多个等待线程继续;如果该操作成功,则返回true;否则,返回false。

 

对于具有 EventResetMode.AutoReset (包括 AutoResetEvent)的 EventWaitHandle,Set 方法释放单个线程。如果没有等待线程,等待句柄将一直保持终止状态,直到某个线程尝试等待它,或者直到它的 Reset 方法被调用。

对于具有 EventResetMode.ManualReset (包括 ManualResetEvent)的 EventWaitHandle,调用 Set 方法将使等待句柄一直保持终止状态,直到它的 Reset 方法被调用。

 

2. 读写者线程例子

 

本例子中,主线程作为写线程,要对某个数据(本例中是个变量)赋值(即写动作),而读线程则等待写线程每次写完数据发出通知,待读线程收到通知后,将数据读出并显示。

using System;
using System.Collections.Generic;
using System.Text;

using System.Threading;

namespace TestAutoResetEvent
{
    /// 
    /// 读写者线程
    /// 主线程写,子线程读,且只有将数据写入后,读线程才能将其读出
    /// 
    class Program
    {
        //写线程将数据写入myData
        static int myData;

        //读写次数
        const int readWriteCount = 10;

        //false:初始时没有信号
        static AutoResetEvent autoResetEvent = new AutoResetEvent(false);

        static void Main(string[] args)
        {
            //开启一个读线程(子线程)
            Thread readerThread = new Thread(new ThreadStart(ReadThreadProc));
            readerThread.Name = "ReaderThread";
            readerThread.Start();

            for (int i = 1; i <= readWriteCount; i++)
            {
                Console.WriteLine("MainThread writing : {0}", i);

                //主(写)线程将数据写入
                myData = i;

                //主(写)线程发信号,说明值已写过了
                //即通知正在等待的线程有事件发生
                autoResetEvent.Set();

                Thread.Sleep(1000);
            }

            //终止线程
            readerThread.Abort();
        }

        static void ReadThreadProc()
        {
            while (true)
            {
                //在数据被写入前,读线程等待(实际上是等待写线程发出数据写完的信号)
                autoResetEvent.WaitOne();
                Console.WriteLine("{0} reading : {1}", Thread.CurrentThread.Name, myData);
            }
        }
    }
}
程序运行结果如下:
 

原文链接:http://blog.csdn.net/livelylittlefish/article/details/2706856
加载中
返回顶部
顶部