通过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实现线程同步的更多相关文章

  1. 线程同步——用户模式下线程同步——Interlocked实现线程同步

    线程同步分为用户模式下的线程同步和内核对象的线程同步. 当然用户模式下的线程同步实现速度比内核模式下快,但是功能也有局 //1.利用原子访问: Interlocked系列函数,关于Interlocke ...

  2. C#并行编程(6):线程同步面面观

    理解线程同步 线程的数据访问 在并行(多线程)环境中,不可避免地会存在多个线程同时访问某个数据的情况.多个线程对共享数据的访问有下面3种情形: 多个线程同时读取数据: 单个线程更新数据,此时其他线程读 ...

  3. [C# 线程处理系列]专题四:线程同步

    目录: 一.线程同步概述 二.线程同步的使用 三 .总结 一.线程同步概述 前面的文章都是讲创建多线程来实现让我们能够更好的响应应用程序,然而当我们创建了多个线程时,就存在多个线程同时访问一个共享的资 ...

  4. C#线程学习笔记四:线程同步

    本笔记摘抄自:https://www.cnblogs.com/zhili/archive/2012/07/21/ThreadsSynchronous.html,记录一下学习过程以备后续查用.     ...

  5. 重新想象 Windows 8 Store Apps (46) - 多线程之线程同步: Lock, Monitor, Interlocked, Mutex, ReaderWriterLock

    [源码下载] 重新想象 Windows 8 Store Apps (46) - 多线程之线程同步: Lock, Monitor, Interlocked, Mutex, ReaderWriterLoc ...

  6. C#线程同步技术(二) Interlocked 类

    接昨天谈及的线程同步问题,今天介绍一个比较简单的类,Interlocked.它提供了以线程安全的方式递增.递减.交换和读取值的方法. 它的特点是: 1.相对于其他线程同步技术,速度会快很多. 2.只能 ...

  7. C#多线程之线程同步篇1

    在多线程(线程同步)中,我们将学习多线程中操作共享资源的技术,学习到的知识点如下所示: 执行基本的原子操作 使用Mutex构造 使用SemaphoreSlim构造 使用AutoResetEvent构造 ...

  8. C# 线程同步的三类情景

    C# 已经提供了我们几种非常好用的类库如 BackgroundWorker.Thread.Task等,借助它们,我们就能够分分钟编写出一个多线程的应用程序. 比如这样一个需求:有一个 Winform ...

  9. 【C#进阶系列】29 混合线程同步构造

    上一章讲了基元线程同步构造,而其它的线程同步构造都是基于这些基元线程同步构造的,并且一般都合并了用户模式和内核模式构造,我们称之为混合线程同步构造. 在没有线程竞争时,混合线程提供了基于用户模式构造所 ...

  10. 【C#进阶系列】28 基元线程同步构造

    多个线程同时访问共享数据时,线程同步能防止数据损坏.之所以要强调同时,是因为线程同步问题实际上就是计时问题. 不需要线程同步是最理想的情况,因为线程同步一般很繁琐,涉及到线程同步锁的获取和释放,容易遗 ...

随机推荐

  1. zz 失血模型与充血模型等

    失血模型与充血模型 | 三秋 (贫血模型)优点是系统的层次结构清楚,各层之间单向依赖,Client->(BusinessFacade)->BusinessLogic->Data Ac ...

  2. 关于 K8s 的一些基础概念整理-补充【k8s系列之五】

    〇.前言 本文继续整理下 K8s 的一些基础概念,作为前一篇概念汇总的补充. 前一篇博文链接:https://www.cnblogs.com/hnzhengfy/p/k8s_concept.html. ...

  3. 如何使用特定的SSH Key提交GIT

    问题提出 最近在自己的MAC上面提交Github代码的时候发现居然失败了: $ git push origin master Permission denied (publickey). fatal: ...

  4. java到报名的编码运行

    Hello.java package a.b; import com.beyondiary.kit.KitConstant; public class Hello { public static vo ...

  5. MYSQL支持的数据类型-数值类型

    一.数值类型分类 MYSQL支持所有标准SQL中的数值类型,其中包括严格数值类型(INTEGER.SMALLINT.DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT.REAL和DOU ...

  6. Qt开发经验小技巧236-240

    关于在头文件中定义函数使用static关键字的血的教训. 有时候我们需要将一些常用函数写在一个文件中供很多地方调用,如果写的是 int doxxx{} 这种,在你多个地方引用的时候,肯定会编译报错提示 ...

  7. H5播放音频和视频

    H5播放音频和视频: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> &l ...

  8. github-链接地址

    ------------------------------------------------------ https://github.com/seata https://github.com/a ...

  9. SpringBoot(二) - 核心配置文件 (+ 邮件发送 和 短信发送)

    1.application.properties 和 application.yml 配置文件格式区别 1.1 文件格式 application.properties # 端口号 server.por ...

  10. Java虚拟机调优-典型配置举例

    背景: 以下配置主要针对分代垃圾回收算法而言. 堆大小设置 年轻代的设置很关键 JVM中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制:系统的可用虚拟内存限制:系统的 ...