通过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. Win11 恢复 Win10 风格菜单

    这个效果最好:https://github.com/valinet/ExplorerPatcher 不要入 Start11 之类的坑,也不需要改注册表,改注册表也改不出来.

  2. 执行docker ps时提示"dial unix /var/run/docker.sock: connect: permission denied"

    0. 创建docker用户组 sudo groupadd docker 1. 将当前用户加入docker组 # sudo gpasswd -a $USER docker $ sudo usermod ...

  3. Getting Started with JavaFX

    https://openjfx.io/openjfx-docs/#maven Run HelloWorld using Maven If you want to develop JavaFX appl ...

  4. MAC brew install 跳过 update

    相信很多用 MAC 小伙伴的小伙伴都对 HomeBrew 很熟悉. 但是! 都遇到过这样的问题, 每次安装新东西, 它都要先去 update 一下, 那个耗时啊-. 怎么才能不 update, 直接安 ...

  5. 网络编程入门如此简单(四):一文搞懂localhost和127.0.0.1

    本文由萤火架构分享,原题"localhost和127.0.0.1的区别是什么?",原文链接"juejin.cn/post/7321049446443417638" ...

  6. 自动化测试平台用例执行_Android

      一.搭建过程 参考:https://testerhome.com/topics/15534 (https://github.com/jerrylizilong/autotest_platform) ...

  7. (七).NET6.0部署RabbitMQ

    1.下载erlang语言包OTP.官网地址: https://www.erlang.org/downloads 2.Rabbitmq官网下载地址: https://www.rabbitmq.com/d ...

  8. 2024-12-28 AI智能体日报

  9. 前端面试100-copy

    1.一些开放性题目 1.自我介绍:除了基本个人信息以外,面试官更想听的是你与众不同的地方和你的优势. 2.项目介绍 3.如何看待前端开发? 4.平时是如何学习前端开发的? 5.未来三到五年的规划是怎样 ...

  10. biancheng-Python教程

    目录http://c.biancheng.net/python/ 1Python编程基础2Python编程环境搭建3变量类型和运算符4列表.元组.字典和集合5Python字符串常用方法6Python流 ...