gpt4 book ai didi

c# - ManualResetEventSlim 上的 Wait()-ing 是否保证在取消时抛出?

转载 作者:行者123 更新时间:2023-11-30 16:42:24 24 4
gpt4 key购买 nike

给定以下代码:

CancellationTokenSource cts = new CancellationTokenSource();
ManualResetEventSlim mre = new ManualResetEventSlim();

这两个线程同时执行:

mre.Wait(cts.Token);

cts.Cancel();
mre.Set();

是第一个(调用mre.Wait(cts.Token))保证抛出OperationCanceledException或者是否也有可能它会只是返回吗?

我的直觉告诉我应该预料到这两种情况都会发生(内部竞争条件)。 MSDN 没有给出答案,只是说“while observing the CancellationToken”。

我希望得到关于如何以及为什么的具体细节的答案。

我想抢先发表评论,例如“您应该期望 Cancel()Set() 同时/以任何顺序发生,因此这两种情况,反正”。我完全清楚这一点。

最佳答案

存在竞争条件,因为Waitimplemented像那样:

public bool Wait(int millisecondsTimeout, CancellationToken cancellationToken)
{
ThrowIfDisposed();
cancellationToken.ThrowIfCancellationRequested(); // an early convenience check

if (millisecondsTimeout < -1)
{
throw new ArgumentOutOfRangeException("millisecondsTimeout");
}

if (!IsSet)
{
// lots of stuff here, not relevant
}
return true;
}

第二个线程(同时取消和设置 token )可能会在 cancellationToken.ThrowIfCancellationRequested() 检查和 IsSet 检查之间中断第一个线程。

关于c# - ManualResetEventSlim 上的 Wait()-ing 是否保证在取消时抛出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46810810/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com