一个演示多线程操作及同步的C#程序

【C# & 多线程】多线程中的同步机制。如何安全的读写共享变量。 对于整数类型,还可以使用 Interlocked 类中的Exchange方法,来确保对整数类型的属性的线程安全访问,而无需显式地使用 lock 语句。在多线程环境中,如果没有适当的同步机制,线程之间的交互可能会变得混乱,导致数据不一致、竞态条件等问题。同步的主要目的是控制对共享资源的访问,确保线程之间的正确协作和顺序执行。如果MyProperty属性的get和set访问器都加了lock语句,并且您尝试使 sharedCounter.MyProperty++来增加计数器的值,那么最终的结果可能不是正确。 阅读详情

 

/* 
 * Envionment: Win2kServer+VC#.NET2005
 * Author:     WandyWang 
 * Verion:     1.0
 * Date:       06-3-7
 * Abstract:   演示C#中多线程操作及其同步,示例的原型来自于C#Primer5.7节,细节有所改动 
 
*/

using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;

/*
 * 三个线程:主线程,ping线程(PING.play),pong线程(PONG.play)
 * 主线程  - 输出PING对象和PONG对象的Count属性值 用绿色
 * ping线程 - 对PING.Count加1,输出"ping" 用黄色
 * pong线程 - 对PONG.Count加1,输出"ping" 用红色
 * 线程同步:使用Mutex变量进行同步,不让三个线程的输出颜色混乱
 * 输出  :当去掉同步语句时会出现颜色混乱,但加上同步,则不会出现三个线程输出颜色混乱
 *      根据睡眠时间和输出的交错次数可以看出各个线程得到相等的调度优先权
 * 
*/

namespace CSPrimer5_7
{
    
class TestThread
    
{
        
static void Main( string[] args )
        
{
            pingpong PING 
= new pingpong( " ping ", 20 );
            pingpong PONG 
= new pingpong( " pong ", 100 );

            
//创建两个子线程ping和pong
            Thread ping = new Thread( new ThreadStart(PING.play) );
            Thread pong 
= new Thread( new ThreadStart(PONG.play) );

            pong.Start();
            ping.Start();
            
           
            
//主线程和两个子线程并发执行
            while (ping.IsAlive || pong.IsAlive)
            
{
                
/*
                 * Console.ForegroundColor = ConsoleColor.Green;
                 * Console.Write(" " + PING.Count.ToString() + " " + PONG.Count.ToString());
                 * 两句有可能分开执行,即执行完第一句则转入子线程,
                 * 然后再回来执行下句,所以有时候输出的数字不是绿色
                 * 
                 * 在这两句的上面添加 pingpong.mut.WaitOne();
                 * 下面添加 pingpong.mut.ReleaseMutex();
                 * 就可以解决主线程和进程ping pong的同步问题
                 
*/


                pingpong.mut.WaitOne();

                Console.ForegroundColor 
= ConsoleColor.Green;
                Console.Write(
" " + PING.Count.ToString() + " " + PONG.Count.ToString());

                pingpong.mut.ReleaseMutex();

                Thread.Sleep(
100);

                
//主线程在此等待ping线程退出
                ping.Join();
            }
           

            
//暂停屏幕
            Console.ReadLine();
        }

    }


    
class pingpong
    
{
        
//有属性的字段命名:_identifier
        
//它的属性名:Identifier
        
//没有属性的字段:identifier
        private int delay;
        
private string str;
        
private int max;
        
public static Mutex mut = new Mutex();
                           
        
//构造函数,函数名与类名相同,一般用public修饰,无返回值
        public pingpong( string str, int delay )
        
{
            
this.str = str;
            
this.delay = delay;
            
this.max = 100;
        }


        
private int _count;
        
public int Count
        
{
            
get
            
{
                
return _count;
            }

        }


        
public void play()
        
{ 
           
            
while ( true )
            
{               
                
/*
                 * 若没有 mut.WaitOne();和 mut.ReleaseMutex();
                 * 则ping和pong线程在交错执行时输出的颜色有可能会不时所期望的
                 * 即ping有可能输出为红色,pong有可能输出为黄色
                 * 但是此处还没解决主从线程中的输出混乱问题
                 * 刚开始输出的0 0可能不是绿色
                 
*/

                mut.WaitOne();

                
if(str.IndexOf( 'i' ) != -1)
                    Console.ForegroundColor 
= ConsoleColor.Yellow;
                
else 
                    Console.ForegroundColor 
= ConsoleColor.Red;

                Console.Write( 
this.str );

                mut.ReleaseMutex();
             
                
this._count++;
                Thread.Sleep( 
this.delay );
                
if ( _count >= max )
                    
return;
                
//mut.ReleaseMutex(); 原此句放在此处,但会出现AbandonedMutexException异常

                
/* 因为:(from MSDN)
                 * "如果线程在拥有互斥体时终止,则称此互斥体被放弃。
                 *  此互斥体被设置为终止状态,
                 *  下一个等待的线程获得所属权。
                 *  如果没有线程拥有互斥体,则互斥体状态为终止。
                 *  从 .NET Framework 2.0 版开始,需要该互斥体的下一个线程将引发 
                 *  AbandonedMutexException。在 .NET Framework 2.0 版之前,这样不会引发任何异常。
                 * "
                 * 所以:
                 * 将mut.ReleaseMutex();放在此处,最后ping进程的最后一个输出后会
                 * "在拥有互斥体时终止",会引发AbandonedMutexException异常               
                 
*/

            }
             
        }

    }

}
C#中使用Barrier进行多线程同步:深度解析与实践指南 接下来,我们将通过一个具体的示例来展示如何在C#中使用Barrier进行多线程同步。跟着我一起,一步步来,你会发现这一切并不难。📋。 阅读详情

相关推荐

C#的多线程同步,C#中四种进程或线程同步互斥的控制方法

C#的多线程同步,C#中四种进程或线程同步互斥的控制方法

C#实现多线程局域网扫描器的思路与具体代码

要解决错误“WaitHandles的数量必须小于或等于64”,需要将句柄列表拆分为更小的块,并使用WaitAll分别等待每个块。同时,在使用多线程和异步 I/O 操作时,也需要注意程序的正确性和健壮性。因此,在使用这些技术时,请务必小心并仔细测试程序。具体来说,可以将 IP 地址分成若干段,每个线程负责扫描一段 IP 地址。上述代码实现了一个简单的多线程局域网扫描器,支持 Ping 主机和扫描主机端口,并输出扫描结果。需要注意的是,在实际应用中,可能需要对输入进行严格的验证和过滤,以确保系统安全。

Documentlv的博客 1334

基于Multisim的智能交通灯控制系统仿真与实现(含动态闪烁功能)

本文详细介绍了基于Multisim的智能交通灯控制系统仿真与实现,重点解析了动态闪烁功能的电路设计。通过555定时器、74LS192计数器和JK触发器等核心模块,实现了主干道与支干道的交替通行及黄灯1Hz闪烁功能,为交通灯控制系统设计提供了完整的仿真方案。

weixin_29174013的博客 426

C# 线程间的数据同步机制及示例

C# 线程间的数据同步机制及示例

qq_35320456的博客 3015

无刷直流电机矢量控制(四):基于滑模观测器的无传感器控制

无刷直流电机矢量控制,采用转速、电流双环控制,电流环dq解耦,d轴采用id=0控制,q轴采用转速外环。采用滑模观测器(SMO),根据电压电流信息进行电机位置角度动态估算,模型可直接运行,转速和角度跟踪精度较高。 本文整理了该方法的基本原理,介绍了在MATLAB/Simulink中的建模和仿真过程,最后附上完整的模型文件。 一、基本原理 滑模观测器(下文简称SMO)是基于滑模变结构控制方法的一种状态观测器。其针对无刷直流电机转子位置估算的实现过程如下。 假设采用矢量控...

Forster-C的博客 6868

vhr 微人事系统安装与部署教程(SpringBoot + Vue 项目实战)

vhr(微人事)是一个开源的人力资源管理系统项目。系统采用前后端分离架构,主要技术栈包括:后端:MyBatis前端:VueElement UIAxios数据库:MySQL系统通常包含以下模块:员工管理部门管理职位管理薪资管理权限管理系统管理整体功能已经接近企业级后台系统。vhr(微人事)是一个非常经典的开源人力资源管理系统项目,基于SpringBoot + Vue 前后端分离架构。系统包含:员工管理部门管理权限管理薪资管理。

m0_69484557的博客 487

C#线程同步的几种方法

我们在编程的时候,有时会使用多线程来解决问题,比如你的程序需要在 后台处理一大堆数据,但还要使用户界面处于可操作状态;或者你的程序需要访问一些外部资源如数据库或网络文件等。这些情况你都可以创建一个子线程去处理, 然而,多线程不可避免地会带来一个问题,就是线程同步的问题。如果这个问题处理不好,我们就会得到一些非预期的结果。在网上也看过一些关于线程同步的文章,其实线程同步有好几种方法,下面我就简单的做一下归纳。volatile是最简单的一种同步方法,当然简单是要付出代价的。

积累点滴,保持自我 8397

飞书云文档API实战:从权限申请到自动化操作

本文详细介绍了飞书云文档API的实战应用,从权限申请到自动化操作。内容涵盖如何创建应用、获取关键API权限、理解并使用Tenant Access Token,并通过Python代码示例演示了读取和写入飞书表格数据的具体方法,旨在帮助开发者和业务人员实现文档数据处理的自动化,提升工作效率。

weixin_28318011的博客 1942

由于出现被放弃的mutex,等待过程结束

记录:C#System.Threading.AbandonedMutexException:由于出现被放弃的mutex,等待过程结束 在使用Camera采集图片的过程中,当在画面上进行标记这一动作后,Camera停止采集图像,在大概5s时间后catch出上述错误,排查后发现是使用了mutex.WaitOne()后没有正确释放,在使用了mutex.WaitOne()后必须配套使用mutex.ReleaseMutex(). ...

silenceasas的博客 1262

Delta并联机械手-Codesys实现以及正解逆解研究

由于Codesys的Robotics模块有Delta并联机械手的运动模型,因此借助Codesys的机械手运动模型,研究自己的正解逆解算法。

weixin_42386991的博客 5567

域用户无法修改密码问题的解决方案

问题描述:加域的电脑无法更改密码,提示“无法更新密码,为新密码提供的值不符合字符域的长度、复杂度或历史要求”。 问题原因:域控制器中相关设置问题,主要如下图所示(如启用复杂性、最短期限和强制密码历史) 解决方案:在域控制器中更改对应的密码策略即可: ① 禁用复杂性要求 ② 最短使用期限改为0天 ③ 强制密码历史改为0 如果出现无法更改的情况,如下图箭头所指的图标所示 代表需要在域控制器的组策...

运维日记 3万+

C#中的同步编程和异步编程

【代码】C#中的同步编程和异步编程。

MechMaster 758

轴承寿命预测 | 基于BiLSTM双向长短期记忆神经网络的轴承寿命预测附matlab完整代码

轴承寿命预测 | 基于BiLSTM双向长短期记忆神经网络的轴承寿命预测附matlab完整代码

默默科研仔的博客 274

硬件电路设计经典合集:20个实用电路原理与选型避坑指南

在嵌入式系统与工业电子设计中,电源保护、信号调理、电平转换及接口通信是保障系统可靠性的基础环节。其核心原理在于利用MOS管、运放、TVS管等基础元件构建低损耗、高抗扰的电路拓扑,从而提升信号完整性与电磁兼容性。掌握这些通用电路的设计意图与参数计算,能显著降低产品故障率并优化BOM成本。这些技术广泛应用于消费电子、工业控制及汽车电子等领域。本文深入剖析了防反接、过流保护、4-20mA转换及RS-485防护等经典电路,结合工程实践给出选型细节与踩坑经验,助力工程师从“能跑就行”进阶到“跑得漂亮”。

weixin_33965305的博客 315

【系统分析师】第1章-基础知识:绪论(核心总结)

《系统分析师教程(第二版)绪论》概述了系统分析师的核心角色与知识体系。作为信息系统开发的核心复合型人才,系统分析师需具备技术、业务、管理及道德等多维能力,贯穿需求分析、系统设计、协调沟通和质量保障全流程。知识体系涵盖系统工程方法论(如霍尔三维结构)、信息技术基础(数据库/网络技术)及管理学数学基础。教程梳理了该职业从数据处理专家到现代技术整合者的演变历程,并指出职业发展路径(初级分析师至CTO)。第二版新增大数据/AI等前沿内容,强化案例与实践,是软考官方权威教材,为读者构建系统化的学习框架。

数据知道的博客 6909

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

C# 如何实现一个线程暂停和继续

using System; using System.Text; using System.Windows.Forms; using System.Threading; namespace WindowsApplication1 { public partial class Form1 : Form { public Form1() {

打工仔的程序人生 1万+

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

C# 多线程 AutoResetEvent和ManualResetEvent

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace MutiThreadTest {     class Program  

foreverhot1019的博客 1415

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

C#多线程操作----处理并发的问题,Lock关键字

主程序Program.cs using System;using System.Collections.Generic;using System.Text;using System.Threading; namespace MultiThreadedPrinting{ class Program { static void Main(string[] args)...

weixin_30832983的博客 116

C#多线程应用技术面对面探讨[图]

实例程序说明<wbr></wbr><wbr></wbr>  本文的实例程序包括一个列表框、三个按钮。程序使用一个新的线程来运行一个后台处理,结果在列表框中显示。按钮button1启动一个计算平方的线程。按钮button2停止后台处理线程。按钮button3退出程序。程序运行情况如图1所示。<wbr></wbr>  <wb...

43

C# 多线程(2)——线程同步

当在同一时刻多个线程操作共享资源时就会导致数据的错误,但是如果在单一线程中按照顺序就不出现这样的问题,这也就引申出线程同步的内容,保证多个线程提升性能的前提下,也不会出现程式数据的错误,重点就是让多个线程按照一定的顺序同步的执行代码,就是线程同步的概念。lock 排它锁的使用,确保了多个线程在访问竞态代码块时,只有一个线程是获得CPU时间片的,其他的线程处于阻塞中,并处于一个等待队列中。直到锁被释放,等待的线程属于先到先得的情形,依次等待获得锁去执行竞态代码块,保证了线程同步,因此可以保证线程的安全。

contact97的博客 2124

C# 多线程

一、基本概念 1、进程 首先打开任务管理器,查看当前运行的进程: 从任务管理器里面可以看到当前所有正在运行的进程。那么究竟什么是进程呢? 进程(Process)是Windows系统中的一个基本概念,它包含着一个运行程序所需要的资源。一个正在运行的应用程序在操作系统中被视为一个进程,进程可以包括一个或多个线程。线程是操作系统分配处理器时间的基本单元,在进程中可以有多个线程同时执行代码。进...

1万+

一个简单的C#多线程间同步的例子

本博客有关多线程的文章:C#多线程编程(1):线程的启动多线程编程(2):线程的同步多线程编程(3):线程池ThreadPool多线程编程(4):多线程与UI操作在开发中经常会遇到线程的例子,如果某个后台操作比较费时间,我们就可以启动一个线程去执行那个费时的操作,同时程序继续执行。在某些情况下可能会出现多个线程的同步协同的问题,下面的例子就展示了在两个线程之间如何协同工作。这个程序的思路是共同做一

周公(周金桥)的专栏 9万+

C#开发之多线程数据同步

多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。可以提高CPU的利用率。在多线程程序中,一个线程必须等待的时候,CPU可以运行其它的线程而不是等待,这样就大大提高了程序的效率. 实例讲解: 在一个例子中,由函数add实现一数据的增加,delete实现该数据的减少,如果多线程同时操作该数据时,会

whuarui2010的专栏 4503

C#中关于多线程、同步和异步的几点说明

多线程相关操作

zhigedali的博客 1847
上一篇: 不使用辅助变量的两个变量交换
下一篇: High-Resolution Timer
wandywang
博客等级 码龄21年 10粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值