C# 可以在运行时基于CPU体系结构使用条件代码吗?

C# 可以在运行时基于CPU体系结构使用条件代码吗?,c#,multithreading,.net-4.0,memory-barriers,compiler-directives,C#,Multithreading,.net 4.0,Memory Barriers,Compiler Directives,我使用的是.NET4.5(就这个问题而言,预览…4是可以的)。我在做穿线工作 根据我的研究,我知道x86 CPU有一个强大的内存模型,这意味着写操作不会被重新排序。这样可以安全地释放锁。安腾CPU的内存模型较弱,但情况并非如此 我了解易失性、内存障碍和执行重新排序原则 理想情况下,我需要的是在关键点插入内存屏障,如果CPU是安腾,而不是x86。是否可以动态执行此操作,如JIT处理的运行时编译器指令 如果没有,我意识到我需要为这两个平台分别构建。在这种情况下,在不使用两组C#文件的情况下,最优雅的

我使用的是.NET4.5(就这个问题而言,预览…4是可以的)。我在做穿线工作

根据我的研究,我知道x86 CPU有一个强大的内存模型,这意味着写操作不会被重新排序。这样可以安全地释放锁。安腾CPU的内存模型较弱,但情况并非如此

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

理想情况下,我需要的是在关键点插入内存屏障,如果CPU是安腾,而不是x86。是否可以动态执行此操作,如JIT处理的运行时编译器指令


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

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

在另一个答案中,有人提供了以下示例代码的链接(来自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;
    }
}

回答你的主要问题;我认为目前不可能有条件地将CIL指令编译成基于平台的机器指令(除了已经烘焙到JIT编译器中的指令)


从一组源代码创建两个(或更多)版本的主要工具仍然是。

CLR的工作是向您隐藏这些差异。安腾版本有一个非常不同的锁定原语实现。避免不利用这一点。切换到C++,如果你想对机器编程。@ HANSPASTAND是的,但是这并不否认在IA64上锁定释放之前使用内存屏障的必要性,而不是x86/x86—64。@ DavidHeffernan没有帮助。在C++中,我当然必须为每个平台家族都有不同的项目。事实上,我在一个需要锁的情况下使用它。但这是离题的。我不知道你为什么引用你的另一个答案。。。我想知道MS是否会包含条件JIT指令。这不是个坏主意:)