返回首页
当前位置: 主页 > 编程语言 > C#教程 >

c#多线程之实现进程间的通信实现教程

时间:2016-09-30 23:29来源:电脑教程学习网 www.etwiki.cn 编辑:admin

1. 前言

实现同一个进程中不同线程之间的通信是比较容易的,因为不同线程在内存中共享同一个内存地址,数据也是可以共享的。而进程则不同,不同的进程在内存中拥有独立的地址空间,要想实现进程间的通信就必须建立不同进程都可以访问的共享内存。C#在命名空间ystem.Threading下提供了一个类Mutex 来实现跨进程资源的访问。

2. 应用实现及举例

1)场景建立

   假设有A和B两个环境,环境A中存在一个对象a,环境B中存在一个对象b,我们的目的是实现对象a和对象b的同步,对象a和b一个版本号version的属性,如果它们的版本号a-version和b-version相同则可判断二者已同步。为此开发两个同步程序ProgressAtoB和ProgressBtoA,当对象a发生变化时调用ProgressAtoB去更新b,当对象b发生变化时调用ProgressBtoA去更新a,如下图所示:



 

ProgressAtoB执行的操作如下:

  ProgressBtoA执行的操作如下:


2)运行ProgressAtoB和ProgressBtoA

某一时刻的运行结果如下:



根据运行结果我们可以分析得出ProgressAtoB和ProgressBtoA两个进程的运行是交替进行的而且没有一定的时序。这种现象是有两个原因造成的:1.两个进程何时发生切换是由CPU调度实现的,时间是不确定的。2.进程中的操作不具备原子性。
   如果ProgressAtoB进程在未更新版本号之前切换到了ProgressBtoA,ProgressBtoA检测到版本号还是旧的(因为ProgressAtoB还没有对版本号进行更新就切换到了ProgressBtoA)就会重复去更新对象a,这样导致了a的重复更新,甚至会导致对象a和b的循环更新。

3)引入Mutex

 ProgressAtoB执行的操作如下:

ProgressBtoA执行的操作如下:

 
 
某一时刻的运行结果如下:

 


对运行结果分析可知:进程ProgressAtoB在执行时不会切换到进程ProgressBtoA,同样
进程ProgressBtoA在执行时不会切换到进程ProgressAtoB,这样就保证了操作的完整性,避免了重复更新和循环更新的问题。

顶一下
(1)
100%
踩一下
(0)
0%
标签(Tag):c#
------分隔线----------------------------
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
验证码:点击我更换图片
推荐内容