Search

Categories

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Send mail to the author(s) E-mail

# Tuesday, 04 November 2014
public static void Main() { int n = 0; // Trying to accessing a local varialbe from another thread var up = Task.Run(() => { for (int i = 0; i < 1000000; i++){ // Reads the value and adds 1 n++; } }); for (int i = 0; i < 1000000; i++){ // Reads the value and subtracts 1 n--; } // Wait for task to complete execution up.Wait(); // Get a different result each time Console.WriteLine(n); }

If the add thread reads then adds, at the same time the subtract thread reads and subtracts, we’re not going to get the expected total of 0.

int n = 0; var _lock = new object(); var up = Task.Run(() => { for (int i = 0; i < 1000000; i++) { // no way other thread can change value while this one is working on it lock (_lock) { n++; } } }); for (int i = 0; i < 1000000; i++) { lock (_lock) { n--; } } // Wait for task to complete execution up.Wait(); Console.WriteLine(n);

Volatile

Disables compiler optimisations.. enforces code order.

InterLocked

private static void Main() { int n = 0; var up = Task.Run(() => { for (int i = 0; i < 1000000; i++) { Interlocked.Increment(ref n); } }); for (int i = 0; i < 1000000; i++) { Interlocked.Decrement(ref n); } up.Wait(); Console.WriteLine(n); }

 

CancellationTasks

private static void Main() { var cancellationTokenSource = new CancellationTokenSource(); CancellationToken token = cancellationTokenSource.Token; Task task = Task.Run(() => { while (!token.IsCancellationRequested) { Console.Write("*"); Thread.Sleep(1000); } }, token); Console.WriteLine("Press enter to stop the task"); Console.ReadLine(); cancellationTokenSource.Cancel(); Console.WriteLine("Press enter to end the application"); Console.ReadLine(); }
| | #