QQ登录

只需要一步,快速开始

APP扫码登录

只需要一步,快速开始

手机号码,快捷登录

手机号码,快捷登录

查看: 336|回复: 0

[C#/.NET] C#多线程同步

[复制链接]

等级头衔

积分成就    金币 : 2841
   泡泡 : 1516
   精华 : 6
   在线时间 : 1294 小时
   最后登录 : 2024-11-21

丰功伟绩

优秀达人突出贡献荣誉管理论坛元老

联系方式
发表于 2023-9-27 11:15:14 | 显示全部楼层 |阅读模式
在C#中,多线程同步是为了保证多个线程之间的互斥和同步,以避免出现竞态条件和死锁等问题。常见的多线程同步机制包括锁、信号量、事件等。下面分别介绍一下C#中常见的多线程同步机制:4 t& }7 j' s1 R1 b5 P
1. 锁/ K7 Z8 L9 A* t8 O0 o
在C#中,可以使用锁机制来实现多线程同步。锁可以将访问共享资源的线程进行互斥,以避免出现竞态条件。C#中提供了lock关键字来实现锁机制。
6 b# \( m$ {$ O# B& b
  1. private static readonly object locker = new object();
  2. public void Method()
  3. {
  4.     lock (locker)
  5.     {
  6.         // 执行访问共享资源的操作
  7.     }
  8. }
在上面的代码中,使用lock关键字将访问共享资源的线程进行互斥。
8 l  |4 {& l$ V+ q! B. Y/ u" I6 h2. 信号量
; K/ l/ w: @1 r( A" w$ ]在C#中,可以使用信号量机制来控制对共享资源的访问。信号量可以支持多个线程访问同一个共享资源,但只能保证同一时刻最多有n个线程访问该资源。C#中提供了Semaphore类来实现信号量机制。
* `+ _- Z9 R9 Q; f; N/ m
  1. private static readonly SemaphoreSlim semaphore = new SemaphoreSlim(10);
  2. public async Task Method()
  3. {
  4.     await semaphore.WaitAsync();
  5.     try
  6.     {
  7.         // 执行访问共享资源的操作
  8.     }
  9.     finally
  10.     {
  11.         semaphore.Release();
  12.     }
  13. }
在上面的代码中,SemaphoreSlim对象可以支持多个线程访问同一个共享资源,但最多只能有10个线程同时访问该资源。使用semaphore.WaitAsync方法获取访问资源的许可,使用semaphore.Release方法释放访问资源的许可。' Q( ^7 b+ v! T! I% @- W
3. 事件& V- }$ W5 L0 f: b. t$ |+ h
在C#中,可以使用事件来实现线程之间的同步和通信。事件是一种基于观察者模式的机制,可以将一个或多个线程订阅事件,并在事件触发时执行特定的逻辑。C#中提供了EventWaitHandle类和AutoResetEvent类来实现事件机制。
2 z0 w4 o* E, |# ^9 m, G, m8 {$ E3 y
  1. private static readonly EventWaitHandle handle = new AutoResetEvent(false);
  2. public async Task Method()
  3. {
  4.     await Task.Run(() =>
  5.     {
  6.         // 执行某个操作
  7.         handle.Set();
  8.     });
  9.     handle.WaitOne();
  10. }
在上面的代码中,使用EventWaitHandle类和AutoResetEvent类来实现事件机制。使用handle.WaitOne方法等待事件触发,使用handle.Set方法触发事件。, t) Z# U. k! T  ~; {- `0 e) n
在多线程编程中,选择合适的同步机制非常重要。需要根据实际需求和性能考虑选择合适的同步机制,并注意线程安全和死锁等问题。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|paopaomj.COM ( 渝ICP备18007172号|渝公网安备50010502503914号 )

GMT+8, 2024-11-21 22:40

Powered by paopaomj X3.5 © 2016-2025 sitemap

快速回复 返回顶部 返回列表