Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Interlocked.CompareExchange<Int> using GreaterThan or LessThan instead of equality

The System.Threading.Interlocked object allows for Addition (subtraction) and comparison as an atomic operation. It seems that a CompareExchange that just doesn't do equality but also GreaterThan/LessThan as an atomic comparison would be quite valuable.

Would a hypothetical Interlocked.GreaterThan a feature of the IL or is it a CPU-level feature? Both?

Lacking any other option, is it possible to create such a feature in C++ or direct IL code and expose that functionality to C#?

like image 375
makerofthings7 Avatar asked Oct 24 '12 02:10

makerofthings7


1 Answers

You can build other atomic operations out of InterlockedCompareExchange.

public static bool InterlockedExchangeIfGreaterThan(ref int location, int comparison, int newValue) {     int initialValue;     do     {         initialValue = location;         if (initialValue >= comparison) return false;     }     while (System.Threading.Interlocked.CompareExchange(ref location, newValue, initialValue) != initialValue);     return true; } 
like image 121
Raymond Chen Avatar answered Sep 22 '22 13:09

Raymond Chen