多线程(.net)

 我来答
世纪网络17
2022-07-28 · TA获得超过5910个赞
知道小有建树答主
回答量:2426
采纳率:100%
帮助的人:138万
展开全部

通过设置信号来让线程停下来或让线程重新启动

AutoResetEvent 一次只唤醒一个线程,而 ManualResetEvent 可以唤醒多个线程。
AutoResetEvent.WaitOne() 每次只允许一个线程进入,当某个线程得到信号后, AutoResetEvent 会自动将信号设置为不发送状态, 其他调用 WaitOne 的线程只有继续等待.
当某个线程调用了ManualResetEvent.Set() 方法后,除非手工调用 ManualResetEvent.Reset()方法,否则 ManualResetEvent 将一直保持有信号状态,其他调用 WaitOne 的线程获得信号得以继续执行。

为多个线程共享的变量提供原子操作。
如果一条语句在底层处理器上被当作一个独立不可分割的指令,那么它本质上是原子的(atomic)。严格的原子性可以阻止任何抢占的可能。对于 32 位(或更低)的字段的简单读写总是原子的。而操作 64 位字段仅在 64 位运行时环境下是原子的,并且结合了多个读写操作的语句必然不是原子的:

应使用常量进行exchange后的对比逻辑,因为使用变量,读变量未必原子性( 使用 Interlocked.Exchange 进行逻辑判断 Debug 与 Release 模式不一致的经验教训 )

When should the volatile keyword be used in C#?
Sayonara volatile
c# - Volatile keyword usage vs lock
Understand the Impact of Low-Lock Techniques in Multithreaded Apps

双重检查锁定(延迟初始化):

使用布尔值指示初始化

WaitHandle.WaitAll

[参考]
C# 理解 AutoResetEvent 和 ManualResetEvent
ManualResetEvent
volatile
C# Interlocked 笔记
Interlocked 类
ReaderWriterLockSlim
ThreadPool 类
ThreadPool.QueueUserWorkItem
WaitHandle.WaitAll
C# 线程安全集合
为什么 Redis 选择单线程模型 [ 注:Redis知识领域中剖析精华 ]

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式