gpt4 book ai didi

c# - 通过线程池多路复用 C# 5.0 的异步——线程安全吗?

转载 作者:可可西里 更新时间:2023-11-01 08:45:07 27 4
gpt4 key购买 nike

这可能看起来有点疯狂,但如果我可以合理地确定它不会导致奇怪的行为,我正在考虑将其作为更大库的一部分。

方法:

使用分派(dispatch)到线程池的 SynchronizationContext 运行异步用户代码。用户代码看起来像这样:

async void DoSomething()
{
int someState = 2;
await DoSomethingAsync();
someState = 4;
await DoSomethingElseAsync();
// someState guaranteed to be 4?
}

我不确定对 someState 的访问是否是线程安全的。虽然代码将在一个“线程”中运行,这样操作实际上是完全有序的,但它仍然可以在引擎盖下跨多个线程进行拆分。如果我的理解是正确的,那么在 x86 上排序应该是安全的,并且由于变量不是共享的,所以我不需要担心编译器优化等问题。

但更重要的是,我担心这是否会在 ECMA 或 CLR 内存模型下保证线程安全。

我相当确定我需要在执行排队的工作之前插入一个内存屏障,但我对我在这里的推理并不完全有信心(或者由于完全不同的原因,这种方法可能不可行)。

最佳答案

这在 async / await FAQ 的评论部分得到了回答。 :

TPL includes the appropriate barriers when tasks are queued and at the beginning/end of task execution so that values are appropriately made visible.

因此不需要明确的障碍。

关于c# - 通过线程池多路复用 C# 5.0 的异步——线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13356248/

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