@couven92 At first, I thought the easiest was to "give up" on Windows 7, but when I actually ran the test, the program compiled, but failled to link, with this message: atomiks.obj : error LNK2019: unresolved external symbol _InterlockedExchangeAddNoFence referenced in function atomicIncRelaxed_gujWN15RsV5Ef6kAMSLe8w
I'm assuming I'm declaring it correctly, otherwise it wouldn't even compile. But I have no clue how to deal with this error (Google was no help), so I gave up entirely on "NoFence". FYI, this is how I declare it, before using it: const hasThreadSupport = compileOption("threads") and not defined(nimscript) when declared(atomicLoadN): # USE PTHREADS! discard elif defined(vcc) and hasThreadSupport: when defined(cpp): # ... proc interlockedExchangeAddNoFence64(p: pointer; val: int64): int64 {.importcpp: "_InterlockedExchangeAddNoFence64(static_cast<__int64 volatile *>(#), #)", header: "<windows.h>".} proc interlockedExchangeAddNoFence32(p: pointer; val: int32): int32 {.importcpp: "_InterlockedExchangeAddNoFence(static_cast<long volatile *>(#), #)", header: "<windows.h>".} else: # ... proc interlockedExchangeAddNoFence64(p: pointer, val: int64): int64 {.importc: "_InterlockedExchangeAddNoFence64", header: "<windows.h>".} proc interlockedExchangeAddNoFence32(p: pointer, val: int32): int32 {.importc: "_InterlockedExchangeAddNoFence", header: "<windows.h>".} I Interpret this in the MS documentation: > Header Winnt.h (include Windows.h) As saying it's defined in winnt.h, but you should include Windows.h instead, which is what I did. If it's a "compiler intrinsic", then why does the name still even exist at link time? Should it not have been replaced with the ASM code at compile time?