如何识别可重新排序的代码?代码重新排序问题(.NET)

时间:2009-01-15 13:20:32

标签: c# .net

This MSDN article声明:

  

处理器可以自由重新排序此代码

internal static volatile int s_x = 0;
internal static volatile int s_y = 0;
internal static volatile int s_ya = 0;

void ThreadA() {
    s_x = 1;
    s_ya = s_y;
}

我担心是否可以重新排序任何代码,并且我知道如何识别可重新排序的代码。特别关于我的代码:

Processing.Add(ItemNumber, null);
AsyncTask.Begin(InternalRequestCallback, Remove, ItemNumber);

必须按指定顺序发生,否则失败。我应该放一个Thread.MemoryBarrier();这些陈述之间?

1 个答案:

答案 0 :(得分:3)

简短版本:没有。

你的代码只执行两次调用;运行时保证这些方法将按顺序执行(至少在单个线程上)。

本文的复杂性集中在 2 线程访问共享状态的复杂性(您需要ThreadB方法才能使示例有意义)。您粘贴的代码是,我很确定,不可重新订购 - 尤其是因为这是同一线程上的连续指令(依赖数据)。

你需要比我理解的更深入了解全部细节。但除非你使用无锁,线程编程做一些复杂的事情,否则你不太可能咬你。