栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C# > C#教程

C#使用Interlocked实现线程同步

C#教程 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C#使用Interlocked实现线程同步

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

正确结果图:

总结

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/122746.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号