首页 > 编程 > C# > 正文

C#使用Interlocked实现线程同步

2020-01-24 00:13:21
字体:
来源:转载
供稿:网友

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

示例,同时开启两个线程,一个写入数据,一个读出数据

代码如下:(但是运行结果却不是我们想象的那样)

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();    }  }}

运行结果图:(每次运行结果都不一样) 

修改代码如下:

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();    }  }}

正确结果图:

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对武林网的支持。如果你想了解更多相关内容请查看下面相关链接

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表