以下情况可以假定为事实上的线程安全吗? bool
标志始终以false开头,只有一种变为true或保持原样。
我知道它实际上不是线程安全的,但是否有可能真的以某种方式破坏?
在这种情况下,异步执行甚至是严格排序的,并且永远不会并行执行。
bool cancelled = false;
await MyAsyncJob.Process(() =>
{
if (timeout)
{
cancelled = true;
}
});
if (cancelled)
{
DoSomething();
}
答案 0 :(得分:1)
以下情况可以假定为事实上的线程安全吗?布尔标志...
不清楚您指的是哪个标志。
在您的代码中,cancelled
标志将按您期望的方式工作,因为会在设置await
的方法被检查后进行检查。在await
之后运行的代码将看到由等待的方法引起的所有副作用。
但是,timeout
看起来根本不是线程安全的。期待的代码检查timeout
,但是(可能)没有await
使用任何集合 timeout
的代码。
您可能会遇到使用锁之类的麻烦,也可以针对这种情况使用.NET框架提供的CancellationTokenSource
,CancellationToken
和OperationCanceledException
:< / p>
try
{
await MyAsyncJob.Process(() =>
{
cancellationToken.ThrowIfCancellationRequested();
});
}
catch (OperationCanceledException)
{
DoSomething();
}
通过遵循standard pattern,其他开发人员将能够更快地理解您的代码。而且,您完全不必担心线程安全性。所提供的框架类型会解决这个问题。