我正在使用.Net 4.5(对于这个问题,预览... 4很好)。我正在做线程工作。
根据我的研究,我知道x86 CPU具有强大的内存模型,这意味着不会重新排序写入。这使释放锁定安全。对于具有弱内存模型的Itanium CPU,情况并非如此。
我理解易失性,内存障碍和执行重新排序原则。
理想情况下,我需要在关键点插入内存屏障如果 CPU是Itanium,但是如果它是x86则不会。是否有可能动态地执行此操作,就像JIT处理的运行时编译器指令一样?
如果没有,我意识到我需要为这两个平台分别构建。在这种情况下,如果没有2套C#文件,最简单的方法是什么,而只是简单地改变目标?
答案 0 :(得分:1)
我不知道这是否会对你有所帮助,但这个答案中描述了几个选项:
在另一个答案中,有人提供了以下示例代码(来自Paint.NET)的链接,以确定OS体系结构。您可以进行微调,以包含IA64
支票:
private enum Platform
{
X86,
X64,
Unknown
}
internal const ushort PROCESSOR_ARCHITECTURE_INTEL = 0;
internal const ushort PROCESSOR_ARCHITECTURE_IA64 = 6;
internal const ushort PROCESSOR_ARCHITECTURE_AMD64 = 9;
internal const ushort PROCESSOR_ARCHITECTURE_UNKNOWN = 0xFFFF;
[StructLayout(LayoutKind.Sequential)]
internal struct SYSTEM_INFO
{
public ushort wProcessorArchitecture;
public ushort wReserved;
public uint dwPageSize;
public IntPtr lpMinimumApplicationAddress;
public IntPtr lpMaximumApplicationAddress;
public UIntPtr dwActiveProcessorMask;
public uint dwNumberOfProcessors;
public uint dwProcessorType;
public uint dwAllocationGranularity;
public ushort wProcessorLevel;
public ushort wProcessorRevision;
};
[DllImport("kernel32.dll")]
internal static extern void GetNativeSystemInfo(ref SYSTEM_INFO lpSystemInfo);
private static Platform GetPlatform()
{
SYSTEM_INFO sysInfo = new SYSTEM_INFO();
GetNativeSystemInfo(ref sysInfo);
switch (sysInfo.wProcessorArchitecture)
{
case PROCESSOR_ARCHITECTURE_AMD64:
return Platform.X64;
case PROCESSOR_ARCHITECTURE_INTEL:
return Platform.X86;
default:
return Platform.Unknown;
}
}
答案 1 :(得分:1)
回答你的主要问题;我认为目前不可能将CIL指令有条件地编译为基于平台的机器指令(除了JIT编译器中的内容之外)。
从一组源创建两个(或更多)构建的主要工具仍为preprocessor directives。