作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
这可能看起来有点疯狂,但如果我可以合理地确定它不会导致奇怪的行为,我正在考虑将其作为更大库的一部分。
方法:
使用分派(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/
我是一名优秀的程序员,十分优秀!