今天小编就为大家分享一篇关于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();
}
}
}
正确结果图:
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对编程学习网的支持。如果你想了解更多相关内容请查看下面相关链接
织梦狗教程
本文标题为:C#使用Interlocked实现线程同步


基础教程推荐
猜你喜欢
- 实例详解C#实现http不同方法的请求 2022-12-26
- c# – USING块在网站与Windows窗体中的行为不同 2023-09-20
- C#获取指定目录下某种格式文件集并备份到指定文件夹 2023-05-30
- C#中的Linq to JSON操作详解 2023-06-08
- Unity shader实现高斯模糊效果 2023-01-16
- C# 解析XML和反序列化的示例 2023-04-14
- C#中 Json 序列化去掉null值的方法 2022-11-18
- C#调用摄像头实现拍照功能的示例代码 2023-03-09
- Unity 如何获取鼠标停留位置下的物体 2023-04-10
- C#通过标签软件Bartender的ZPL命令打印条码 2023-05-16