线程同步(使用Interlocked类)

通过System.Threading命名空间的Interlocked类控制计数器,从而实现进程 的同步。Iterlocked类的部分方法如下表:
线程同步(使用Interlocked类)_第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();
        }
    }
}

运行结果图:(每次运行结果都不一样)
线程同步(使用Interlocked类)_第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();
        }
    }
}

正确结果图:
线程同步(使用Interlocked类)_第3张图片

你可能感兴趣的:(线程,线程同步,Interlock类,ジ﹋★☆『,自,卟,說,』,Unity,实例练习)