C#使用Interlocked实现线程同步
通过System.Threading命名空间的Interlocked类控制计数器,从而实现进程 的同步。Iterlocked类的部分方法如下表:
示例,同时开启两个线程,一个写入数据,一个读出数据
代码如下:(但是运行结果却不是我们想象的那样)
1 static void Main(string[] args)
2 {
3 //缓冲区,只能容纳一个字符
4 char buffer = ',';
5 string str = ""这里面的字会一个一个读取出来,一个都不会少,,,"";
6 //线程:写入数据
7 Thread writer = new Thread(() =>
8 {
9 for (int i = 0; i < str.Length; i++)
10 {
11 buffer = str[i];
12 Thread.Sleep(20);
13 }
14 }
15 );
16 //线程:读出数据
17 Thread Reader = new Thread(() =>
18 {
19 for (int i = 0; i < str.Length; i++)
20 {
21 char chartemp = buffer;
22 Console.Write(chartemp);
23 Thread.Sleep(30);
24 }
25 }
26 );
27 writer.Start();
28 Reader.Start();
29 Console.ReadKey();
30 }
运行结果图:(每次运行结果都不一样)
修改代码如下:
1 class Program
2 {
3 //缓冲区,只能容纳一个字符
4 private static char buffer;
5 //标识量(缓冲区中已使用的空间,初始值为0)
6 private static long numberOfUsedSpace = 0;
7 static void Main(string[] args)
8 {
9 //线程:写入者
10 Thread Writer = new Thread(delegate ()
11 {
12 string str = "这里面的字会一个一个读取出来,一个都不会少,,,";
13 for (int i = 0; i < 24; i++)
14 {
15 //写入数据前检查缓冲区是否已满
16 //如果已满,就进行等待,直到缓冲区中的数据被进程Reader读取为止
17 while (Interlocked.Read(ref numberOfUsedSpace) == 1)
18 {
19 Thread.Sleep(50);
20 }
21 buffer = str[i]; //向缓冲区写入数据
22 //写入数据后把缓冲区标记为满(由0变为1)
23 Interlocked.Increment(ref numberOfUsedSpace);
24 }
25 });
26 //线程:读出者
27 Thread Reader = new Thread(delegate ()
28 {
29 for (int i = 0; i < 24; i++)
30 {
31 //读取数据前检查缓冲区是否为空
32 //如果为空,就进行等待,直到进程Writer向缓冲区中写入数据为止
33 while (Interlocked.Read(ref numberOfUsedSpace) == 0)
34 {
35 Thread.Sleep(50);
36 }
37 char ch = buffer; //从缓冲区读取数据
38 Console.Write(ch);
39 Interlocked.Decrement(ref numberOfUsedSpace);
40 }
41 });
42 //启动线程
43 Writer.Start();
44 Reader.Start();
45 Console.ReadKey();
46 }
正确结果图:
原文地址:https://www.jb51.net/article/149543.htm
C#使用Interlocked实现线程同步的更多相关文章
- 线程同步——用户模式下线程同步——Interlocked实现线程同步
线程同步分为用户模式下的线程同步和内核对象的线程同步. 当然用户模式下的线程同步实现速度比内核模式下快,但是功能也有局 //1.利用原子访问: Interlocked系列函数,关于Interlocke ...
- C#并行编程(6):线程同步面面观
理解线程同步 线程的数据访问 在并行(多线程)环境中,不可避免地会存在多个线程同时访问某个数据的情况.多个线程对共享数据的访问有下面3种情形: 多个线程同时读取数据: 单个线程更新数据,此时其他线程读 ...
- [C# 线程处理系列]专题四:线程同步
目录: 一.线程同步概述 二.线程同步的使用 三 .总结 一.线程同步概述 前面的文章都是讲创建多线程来实现让我们能够更好的响应应用程序,然而当我们创建了多个线程时,就存在多个线程同时访问一个共享的资 ...
- C#线程学习笔记四:线程同步
本笔记摘抄自:https://www.cnblogs.com/zhili/archive/2012/07/21/ThreadsSynchronous.html,记录一下学习过程以备后续查用. ...
- 重新想象 Windows 8 Store Apps (46) - 多线程之线程同步: Lock, Monitor, Interlocked, Mutex, ReaderWriterLock
[源码下载] 重新想象 Windows 8 Store Apps (46) - 多线程之线程同步: Lock, Monitor, Interlocked, Mutex, ReaderWriterLoc ...
- C#线程同步技术(二) Interlocked 类
接昨天谈及的线程同步问题,今天介绍一个比较简单的类,Interlocked.它提供了以线程安全的方式递增.递减.交换和读取值的方法. 它的特点是: 1.相对于其他线程同步技术,速度会快很多. 2.只能 ...
- C#多线程之线程同步篇1
在多线程(线程同步)中,我们将学习多线程中操作共享资源的技术,学习到的知识点如下所示: 执行基本的原子操作 使用Mutex构造 使用SemaphoreSlim构造 使用AutoResetEvent构造 ...
- C# 线程同步的三类情景
C# 已经提供了我们几种非常好用的类库如 BackgroundWorker.Thread.Task等,借助它们,我们就能够分分钟编写出一个多线程的应用程序. 比如这样一个需求:有一个 Winform ...
- 【C#进阶系列】29 混合线程同步构造
上一章讲了基元线程同步构造,而其它的线程同步构造都是基于这些基元线程同步构造的,并且一般都合并了用户模式和内核模式构造,我们称之为混合线程同步构造. 在没有线程竞争时,混合线程提供了基于用户模式构造所 ...
- 【C#进阶系列】28 基元线程同步构造
多个线程同时访问共享数据时,线程同步能防止数据损坏.之所以要强调同时,是因为线程同步问题实际上就是计时问题. 不需要线程同步是最理想的情况,因为线程同步一般很繁琐,涉及到线程同步锁的获取和释放,容易遗 ...
随机推荐
- 2024年1月Java项目开发指南8:统一数据返回格式
有时候返回一个字符串,有时候返回一串数字代码,有时候返回一个对象-- 不过怎么说,我们返回的内容往往具有三个 1.消息代码 code 2.消息内容 msg 3.数据内容 data 接下来,我们要编写一 ...
- nginx国密ssl测试
文章目录文件准备编译部署nginx申请国密数字证书配置证书并测试文件准备下载文件并上传到服务器,这里使用centos 7.8 本文涉及的程序文件已打包可以直接下载. 点击下载 下载国密版openssl ...
- 在 .NET Core 中使用 ActionBlock 实现高效率的多步骤数据处理
目录 一.引言 二.ActionBlock介绍 什么是 ActionBlock? ActionBlock 的特点 ActionBlock 的使用场景 ActionBlock 的基本用法 三.假设场景 ...
- Qt编写的项目作品18-数据导入导出(xls/pdf)及打印示例
一.功能特点 组件同时集成了导出数据到csv.xls.pdf和打印数据. 所有操作全部提供静态方法无需new,数据和属性等各种参数设置采用结构体数据,极为方便. 同时支持QTableView.QTab ...
- Datawhale冬令营第二期!Task2🌼
Datawhale冬令营第二期-Task2:学AI编程的Prompt工程,提升效果 对应链接:https://www.datawhale.cn/activity/116/23/95?rankingPa ...
- 基于Netty,徒手撸IM(一):IM系统设计篇
本文收作者"大白菜"分享,有改动.注意:本系列是给IM初学者的文章,IM老油条们还望海涵,勿喷! 1.引言 这又是一篇基于Netty的IM编码实践文章,因为合成一篇内容太长,读起来 ...
- 【狂神说Java】Java零基础学习笔记-异常
[狂神说Java]Java零基础学习笔记-异常 异常01:Error和Exception 什么是异常 实际工作中,遇到的情况不可能是非常完美的.比如:你写的某个模块,用户输入不一定符合你的要求.你的程 ...
- 使用 SK Plugin 给 LLM 添加能力
前几篇我们介绍了如何使用 SK + ollama 跟 LLM 进行基本的对话.如果只是对话的话其实不用什么 SK 也是可以的.今天让我们给 LLM 整点活,让它真的给我们干点啥. What is Pl ...
- linux下使用CPAN安装Perl模块
首先从CPAN网站下载CPAN模块 此处使用wget命令直接在linux下下载: wget https://cpan.metacpan.org/authors/id/A/AN/ANDK/CPAN-2. ...
- 如何设计一个注册中心?以Zookeeper为例
这是小卷对分布式系统架构学习的第8篇文章,在写第2篇文章已经讲过服务发现了,现在就从组件工作原理入手,讲讲注册中心 以下是面试题: 某团面试官:你来说说怎么设计一个注册中心? 我:注册中心嘛,就要有服 ...