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 基元线程同步构造
多个线程同时访问共享数据时,线程同步能防止数据损坏.之所以要强调同时,是因为线程同步问题实际上就是计时问题. 不需要线程同步是最理想的情况,因为线程同步一般很繁琐,涉及到线程同步锁的获取和释放,容易遗 ...
随机推荐
- CreateElement vs DOM Parser
Benchmark: CreateElement vs DOM Parser - MeasureThat.net 可见 createElement 效率并不逊于 HTML.
- adduser和addgroup命令讲解
https://wiki.alpinelinux.org/wiki/Setting_up_a_new_user 在Alpine Linux下创建用户和组命令分别是adduser和addgroup,本文 ...
- Spring Cloud Sleuth in a Monolith Application
1. Overview In this article, we're introducing Spring Cloud Sleuth – a powerful tool for enhancing ...
- 买苹果MacBook Pro ,有必要买care吗?
先了解一下AppleCare+ for Mac的服务范围:将原先的一年保修延长至三年,并且提供两次收取服务费的意外保修服务,以及当电池寿命低于80%时免费的电池更换.其中,意外保修服务依然是要收费的, ...
- Qt音视频开发40-人脸识别离线版
一.前言 上一篇文章写了在线调用人脸识别api进行处理,其实很多的客户需求是要求离线使用的,尤其是一些事业单位,严禁这些刷脸数据外泄上传到服务器,尽管各个厂家号称严格保密这些数据,但要阻止这些担心,唯 ...
- Qt音视频开发15-mpv事件订阅
一.前言 在使用libmpv的过程中,通过对mpv事件订阅,可以更准确和准时的得知一些事件,比如文件打开成功,播放状态的改变等,而不需要定时器去读取状态,尤其是打开成功这个事件,如果不采用事件订阅,有 ...
- [AI] 基于大模型的AI搜索引擎
概述:基于大模型的AI搜索引擎 ∈ 大模型智能体应用 AI搜索引擎的架构与组成 用户层:用户输入问题/关键词 Agent层: 用户的输入(当前和历史) + 问题提问模板 => 标准的问题 ... ...
- MySQL---约束、主从复制原理、Docker搭建
MySQL(11)---约束 含义: 一种限制,用于限制表中的数据,为了保证表中的数据的准确和可靠性. 先把Mysql几种约束列出来: 主键约束 外键约束 唯一性约束 非空约束 默认值约束 自增约束 ...
- MQ的定时任务改装,实现自定义定时:MQ+redis
package com.*.server.live.listener; import com.*.common.core.entity.constant.LiveConstant; import co ...
- 「NOIP2024」 树上查询
update 2024/12/28 题目描述 给定一棵树,每次询问区间 \([l,r]\) 的 \[\max_{l \le l' \le r' \le r \land r' - l' + 1 \ge ...