2009-01-15 37 views
1

This MSDN article指出:如何识别可重新编码的代码?代码重新排序问题(.NET)

处理器可以自由地重新安排该代码

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();这些陈述之间?

+0

如果您担心代码重新排序,您要么创建一些时髦,难以理解和维护代码,否则您可能不需要担心它。你能解释为什么你认为你提供的代码片段会被重新排序吗? – 2009-01-15 13:28:03

回答

3

Short version:no。

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

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

您需要比我理解的要深入得多,以了解详细信息。但是除非你使用无锁的线程化编程来做一些复杂的事情,否则这不太可能会让你感到困扰。