4

我正在使用.Net 4.5(预览... 4 就这个问题而言很好)。我正在做线程工作。

根据我的研究,我知道 x86 CPU 具有强大的内存模型,这意味着写入不会被重新排序。这使得释放锁是安全的。对于内存模型较弱的 Itanium CPU 而言,情况并非如此。

我了解易失性、内存障碍和执行重新排序原则。

理想情况下,如果CPU 是 Itanium,我需要在关键点插入内存屏障,但如果它是 x86,则不需要。是否可以动态地执行此操作,就像 JIT 处理的运行时编译器指令一样?

如果没有,我意识到我需要为这两个平台分别构建。在这种情况下,在没有 2 组 C# 文件的情况下执行此操作的最优雅方法是什么,而只需更改目标?

4

2 回答 2

1

回答您的主要问题;我认为目前不可能将 CIL 指令有条件地编译为基于平台的机器指令(除了 JIT 编译器中的内容)。

从一组源创建两个(或多个)构建的主要工具仍然是预处理器指令

于 2011-10-26T03:34:24.827 回答
1

我不知道这是否会对您有所帮助,但是此答案中描述了几个选项:

在另一个答案中,有人提供了指向以下示例代码的链接(来自 Paint.NET)以确定操作系统架构。您可以进行细微调整以包括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;
    }
}
于 2011-10-24T21:31:46.027 回答