线程同步(使用Interlocked类)

来源:互联网 发布:淘宝和购家具怎么样 编辑:程序博客网 时间:2024/06/06 20:44

通过System.Threading命名空间的Interlocked类控制计数器,从而实现进程 的同步。Iterlocked类的部分方法如下表:
1

示例,,同时开启两个线程,一个写入数据,一个读出数据,,,
代码如下:(但是运行结果却不是我们想象的那样)

using System;using System.Threading;namespace 线程同步{    class Program    {        static void Main(string[] args)        {            //缓冲区,只能容纳一个字符            char buffer = ',';            string str = ""这里面的字会一个一个读取出来,一个都不会少,,,"";            //线程:写入数据            Thread writer = new Thread(() =>            {                for (int i = 0; i < str.Length; i++)                {                    buffer = str[i];                    Thread.Sleep(20);                }            }                          );            //线程:读出数据            Thread Reader = new Thread(() =>            {                for (int i = 0; i < str.Length; i++)                {                    char chartemp = buffer;                    Console.Write(chartemp);                    Thread.Sleep(30);                }            }            );            writer.Start();            Reader.Start();            Console.ReadKey();        }    }}

运行结果图:(每次运行结果都不一样)
2
修改代码如下:

using System;using System.Threading;namespace 线程同步{    class Program    {        //缓冲区,只能容纳一个字符        private static char buffer;        //标识量(缓冲区中已使用的空间,初始值为0)        private static long numberOfUsedSpace = 0;        static void Main(string[] args)        {            //线程:写入者            Thread Writer = new Thread(delegate ()            {                string str = "这里面的字会一个一个读取出来,一个都不会少,,,";                for (int i = 0; i < 24; i++)                {                    //写入数据前检查缓冲区是否已满                    //如果已满,就进行等待,直到缓冲区中的数据被进程Reader读取为止                    while (Interlocked.Read(ref numberOfUsedSpace) == 1)                    {                        Thread.Sleep(50);                    }                    buffer = str[i];    //向缓冲区写入数据                   //写入数据后把缓冲区标记为满(由0变为1)                   Interlocked.Increment(ref numberOfUsedSpace);                }            });            //线程:读出者            Thread Reader = new Thread(delegate ()            {                for (int i = 0; i < 24; i++)                {                    //读取数据前检查缓冲区是否为空                    //如果为空,就进行等待,直到进程Writer向缓冲区中写入数据为止                    while (Interlocked.Read(ref numberOfUsedSpace) == 0)                    {                        Thread.Sleep(50);                    }                    char ch = buffer;       //从缓冲区读取数据                    Console.Write(ch);                    Interlocked.Decrement(ref numberOfUsedSpace);                }            });            //启动线程            Writer.Start();            Reader.Start();            Console.ReadKey();        }    }}

正确结果图:
3

原创粉丝点击