- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在阅读以下文章:
http://www.albahari.com/threading
而且我无法意识到 AutoResetEvent 和用 maximumCount = 1 初始化的信号量之间的区别。只是为了看看我是否做对了......这两种构造有什么区别吗?
谢谢!
最佳答案
是的,肯定有区别。 信号量
用于限制对资源或代码块的访问。当 WaitOne
被调用时,线程将阻塞,直到信号量的计数可用。要进行计数,您可以调用 Release
。最大计数为 1 的信号量通常称为二进制信号量。这种性质的信号量只允许从单个线程访问资源或 block 代码。您可以使用二进制信号量代替互斥锁或监视器。关于 Semaphore
需要记住的重要一点是,它的状态是手动通过调用 WaitOne
和 Release
来控制的。
另一方面,AutoResetEvent
主要用作信号机制。一个线程将通过调用 WaitOne
等待信号而阻塞。另一个线程将调用 Set
来启动该信号。 ARE 将此信号发布给一个且仅一个线程,然后立即将 ARE 重置为无信号状态。关于 AutoResetEvent
需要记住的重要一点是,它是手动通过调用 Set
发出信号并自动重置在对 WaitOne
的单个调用返回后。
所以这里是差异的总结:
信号量
的状态是手动控制的。AutoResetEvent
的状态是手动设置的,但会自动重置。Semaphore
线程通常会平衡 Release
和 WaitOne
调用。AutoResetEvent
,一个线程通常被指定为发信号者,另一个线程是等待者。信号量
限制对资源或代码块的访问。AutoResetEvent
向线程发出信号以采取某些操作。将 AutoResetEvent
想象成通往走廊的门。在收到命令后,门将只允许一个人通过门。一旦有人穿过门,它就会立即关闭并等待另一个命令。只要门不断收到新命令,走廊就可以自由容纳与发出的命令数量一样多的人。
将 Semaphore
想象成通往同一走廊的门。门将允许一定数量的人进入走廊。门保持打开状态,直到走廊达到其占用限制,此时门会关闭。当有人从另一边离开走廊后,这扇门会再次打开。
更新:
这是一个最简单的示例,它可以证明某些东西明显不同。
static void Main()
{
var are = new AutoResetEvent(false);
are.Set();
are.Set();
var semaphore = new Semaphore(0, 1);
semaphore.Release();
semaphore.Release();
}
毫不奇怪,您会在第二次 semaphore.Release
调用中遇到异常,而第二次调用 Set
却顺利通过。原因是因为 ARE 正在设置 bool 标志,而信号量正在尝试增加计数。
WaitOne
方法将以相同的方式工作,但 Release
和 Set
方法不会。正是由于这个原因,二进制信号量不能与 ARE 互换。但是,在某些情况下,ARE 可以与二进制 信号量互换。
存在重叠的一种情况是在单个线程的锁存器的情况下。
public static void Main()
{
var latch = new AutoResetEvent(false);
new Thread(
() =>
{
latch.WaitOne(); // Wait for the latch.
}).Start();
latch.Set(); // Release the latch.
}
这是一个只能由 AutoResetEvent
满足的场景。
static void Main()
{
var are = new AutoResetEvent(false);
new Thread(
() =>
{
while (true)
{
are.WaitOne();
Console.WriteLine("go");
Thread.Sleep(2000);
}
}).Start();
while (true)
{
are.Set();
Console.WriteLine("pulse");
Thread.Sleep(1000);
}
}
关于c# - AutoResetEvent 和 maximumCount = 1 的信号量之间有什么区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6481416/
即使使用多年,我仍然不明白 AutoResetEvent 是如何工作的。 当谈到Set()时,是否应该有一部分代码在某处等待WaitOne()? 也就是说..如果在WaitOne()之前成功调用了Se
假设我正在处理来自多个线程的大量传入数据。当满足某些条件时,我可能希望这些数据充当特定操作的触发器。然而, Action 不可重入;所以同一个触发器被快速连续触发两次应该只会导致 Action 运行一
我有两个方法,ProcessQueue 和 AddToQueue,它们发生在不同的线程上。有时我会尝试在将项目添加到队列之前处理队列,此时我想等待将项目添加到队列中。我还想确保我永远不会遇到这样的情况
我在处理来自外部类的线程时遇到问题。我在线程方面还很陌生,所以很多事情对我来说仍然是个谜,所以请记住这一点。 我做了我的研究,发现了很多关于它的主题,包括: How to Sleep a thread
super 简单的问题,但我只是想澄清一下。我希望能够使用 AutoResetEvent 重新启动线程,因此我将以下方法序列调用到我的 AutoResetEvent。 setupEvent.Reset
我有两种与以下方法类似的方法。在 MainThreadDoWork 方法中,无论 OtherThreadWork 方法中的 autoResetEvent.Set() 是什么,循环都会完成执行。知道这个
private ConcurrentQueue _queue = new ConcurrentQueue(); private AutoResetEvent _queueNotifier = new
我在类库中有以下代码。然后我等待回拨到我的主应用程序中。我正在进行 DownloadStringAsync 调用,因此我必须等待几秒钟才能在完成后获得回调。我有 3 个这样的调用要等待,所以在我的主应
使用 Xamarin.Forms(适用于 iOS),我尝试实现在继续之前等待用户确认已设置 GeoLocation 权限的功能。 我尝试实现这一点的方法是让线程等待直到使用 AutoResetEven
有人可以介绍 AutoResetEvent.Reset() 方法的用例吗?我什么时候以及为什么要使用这种方法?我了解 WaitOne 和 Set,但这对我来说还不清楚。 最佳答案 是的,每当等待事件的
我可能超出了 AutoResetEvent 的正确设计范围,但不太清楚该求助于什么。我想要这种行为: var autoResetEvent = new AutoResetEvent(false); a
我一直在使用 AutoResetEvent 在线程之间进行同步。 一些线程(A-F)调用 autoresetevent.WaitOne();在等待另一个线程 (X) 完成其工作时 当拥有 autore
考虑以下模式: private AutoResetEvent signal = new AutoResetEvent(false); private void Work() { while (
我正在 .NET (C#) 中的多线程服务器中创建一些“工具”。 检查 .NET ManualResetEvent 的值相当容易,无需担心更改值: aManualResetEvent.WaitOne(
假设我必须在 .Net 3.5 SP1 中编排同步算法,标题中列出的任何同步原语都非常适合该任务。 从性能的角度来看,是否有任何一个比其他的性能更好? 我问这个是因为我已经编码了一段时间,但对这个主题
我在 RegisterWaitForSingleObject 中阅读过: http://www.albahari.com 而且我不明白我什么时候更喜欢使用 AutoResetEvent 而不是 Reg
我正在尝试实现AutoResetEvent。为此,我使用一个非常简单的类: public class MyThreadTest { static readonly AutoResetEvent
我正在尝试使用生产者消费者模式来处理和保存一些数据。我正在使用 AutoResetEvent 在两个 therads 之间发送信号,这里是我的代码 这里是生产者函数 public Results[]
我正在阅读 MSDN 上的 AutoResetEvent 文档,随后的警告有点让我困扰...... “重要:不能保证每次调用 Set 方法都会释放一个线程。如果两次调用距离太近,以至于第二次调用发生在
是c# ManualResetEvent和 AutoResetEvent创建或维护类的成本很高吗? 它们是否消耗某种有限的 Windows 内核资源,如果是,它的限制程度如何? 例如如果我的代码可以每
我是一名优秀的程序员,十分优秀!