在.NET中的线程处理(5)

原创 2002年04月22日 09:38:00

Mutex  [C#]<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

可以使用 Mutex 对象在线程之间以及跨进程进行同步。虽然 Mutex 不具备 Monitor 类的所有等待和脉冲功能,但它的确提供了创建可在进程之间使用的命名的互斥体的功能。

调用 WaitOneWaitAllWaitAny 可以请求 Mutex 的所属权。如果没有任何线程拥有它,则 Mutex 的状态为已发信号的状态。

如果某个线程拥有 Mutex,则该线程就可以在重复的等待-请求调用中指定同一个 Mutex,而不必阻塞其执行;但是,它必须释放与释放所属权相同的次数的 Mutex

如果某个线程在拥有 Mutex 时正常终止,则 Mutex 的状态将被设置为已发信号的状态,并且下一个等待线程将获取所属权。Mutex 类与 Win32 CreateMutex 调用相对应。

下面的 C# 代码示例说明了 Mutex 的使用。

Interlocked  [C#]

Interlocked 方法 CompareExchangeDecrementExchangeIncrement 提供了一种简单机制,以同步对多个线程所共享的变量的访问。如果该变量位于共享内存中,则不同进程的线程就可以使用该机制。

IncrementDecrement 函数将递增或递减变量与检查结果值的操作组合起来。该原子操作对于多任务操作系统十分有用,在这种操作系统中,系统可以中断一个线程的执行,以便将一个处理器时间片授予另一个线程。如果没有这样的同步,则一个线程可能在递增某个变量后但尚未能够检查该变量的结果值之前被系统中断。然后,第二个线程可以递增同一个变量。当第一个线程收到其下一个时间片时,它将检查该变量的值,而现在该值已被递增了两次而不是一次。Interlocked 变量访问函数可以防止出现这种错误。

Exchange 函数自动交换指定变量的值。CompareExchange 函数组合以下两个操作:比较两个值以及根据比较的结果将第三个值存储在其中一个变量中。

在现代处理器中,Interlocked 类的方法通常可以由单个指令来实现。这样,Interlocked 类的方法就可以提供高性能的同步,并可用于生成较高级别的同步机制,如旋转锁。

Interlocked 公开的ExchangeCompareExchange 方法采用可以存储引用的 Object 类型的参数。但是,类型安全要求将所有参数严格类型化为 Object;不能在对其中一个方法的调用中简单地将对象强制转换为 Object。换言之,您必须创建 Object 类型的变量,将自定义对象赋给该变量,然后传递该变量。下面的简单 C# 代码示例将只允许使用单个调用来设置此属性。

ReaderWriterLock

ReaderWriterLock 定义实现单个编写器/多个阅读器语义的锁。ReaderWriterLock

  • 开销非常低,足以大量使用(如针对每个对象的同步)。

  • 尝试在编写器和阅读器之间寻求平衡。一旦请求了编写器锁,就不会再接受任何新的阅读器,直到该编写器具有访问权限为止。编写器和阅读器都不会被永久地拒绝访问。

  • 支持超时,这是用于检测死锁的很有价值的功能。

  • 支持事件缓存。这就使事件可以从争用程度最小的区域移动到争用程度最大的区域。换句话说,进程中的线程数限制了阅读器锁或编写器锁所需要的事件数。

  • 支持由阅读器和编写器嵌套的锁。

  • 支持旋转计数以避免在多处理器计算机上进行上下文切换。

  • 支持用指示中间编写操作的返回参数升级到编写器锁和从编写器锁降级从而还原锁的状态的功能。

  • 支持为调用应用程序代码释放锁的功能。RestoreLock 还原锁的状态并指示中间编写操作。

  • 从最常见的失败(如创建事件失败)中恢复。换句话说,锁维护一致的内部状态并保持可用。

[.Net线程处理系列]专题二:线程池中的工作者线程

目录: 一、上节补充 二、CLR线程池基础 三、通过线程池的工作者线程实现异步 四、使用委托实现异步 五、任务 六、小结   一、上节补充 对于T...
  • gws1229
  • gws1229
  • 2014年01月16日 14:41
  • 820

ASP.NET中的多线程整理

线程,是操作系统中的术语,是操作系统进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。一个进程可以有很多线程,每条线程并行执行不同的任务。同一进程中的多条线程将共享该进程中的全部系统...
  • taoerchun
  • taoerchun
  • 2016年03月24日 18:27
  • 2098

在 .NET Core 中的并发编程

今天我们购买的每台电脑都有一个多核心的 CPU,允许它并行执行多个指令。操作系统通过将进程调度到不同的内核来发挥这个结构的优点。 然而,还可以通过异步 I/O 操作和并行处理来帮助我们提高单个应...
  • quryktcs
  • quryktcs
  • 2017年05月07日 15:54
  • 591

.Net多线程编程—并发集合

并发集合 1 为什么使用并发集合? 原因主要有以下几点: System.Collections和System.Collections.Generic名称空间中所提供的经典列表、集合和...
  • yanlu86237
  • yanlu86237
  • 2017年01月07日 15:42
  • 528

【.NET线程--进阶(一)】--线程方法详解

线程的优缺点决定了在开发过程中是否使用多线程,另外灵活运行单线程的方法来实现灵活的控制线程,两个Demo使用了线程的基本方法,能够更加深刻的了解它们的使用。线程和线程之间的调用关系,以及如何实现线程间...
  • zhang_xinxiu
  • zhang_xinxiu
  • 2014年02月07日 09:18
  • 4639

【.NET线程--开篇】--线程从零开始

马上就过年了,在此先提前祝福朋友们春节快乐,马年大吉。相信大家对线程并不陌生,当提到线程时条件反射的会先想到一条线执行的程序,这样解释是否正确呢?我们姑且不讨论这个问题,要想知道这个答案去教材书上查看...
  • zhang_xinxiu
  • zhang_xinxiu
  • 2014年01月30日 08:15
  • 4579

谈.Net委托与线程——解决窗体假死(三)

引言   在之前的《创建无阻塞的异步调用》中,已经介绍过异步调用的编写步骤和实施原理。异步调用是CLR为开发者提供的一种重要的编程手段,它也是构建高性能、可伸缩应用程序的关键。在多核CPU越来越普及...
  • cqkxzyi
  • cqkxzyi
  • 2014年11月14日 23:30
  • 946

VB.NET多线程入门

最近项目中遇到了一个处理速度慢堵塞用户界面操作的问题,因此想用多线程来解决。 在处理数据的循环中,新建线程,在新建的线程中处理数据。多线程同时处理数据,以此来达到加速的目的。 在多任务操作系统中,我们...
  • u013162930
  • u013162930
  • 2015年12月07日 20:54
  • 3528

c#多线程与异步开发 (上)

项目中需要一些多线程或异步的知识点,找资料时看到了这篇文章,觉得讲的很不错,转载过来,想要学习的可以看原文,原文链接,感谢原作者提供好文章引言本文主要从线程的基础用法,CLR线程池当中工作者线程与I/...
  • suifcd
  • suifcd
  • 2016年01月22日 19:32
  • 4687

C# 中的IOCP线程池

原文地址:http://www.theukwebdesigncompany.com/articles/iocp-thread-pooling.php PartOne : Introduction ...
  • github_30397645
  • github_30397645
  • 2015年08月17日 15:27
  • 640
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在.NET中的线程处理(5)
举报原因:
原因补充:

(最多只允许输入30个字)