Search code examples
multithreadinglock-free

Can I determine the result of a data race without reading the value?


I'm trying to better understand lock-free programming:

Suppose we have two threads in a data race:

// Thread 1
x = 1

// Thread 2
x = 2

Is there a lock-free way a third thread can know the result of the race without being able to read x?

Suppose thread 3 consumes a lock-free queue, and the code is:

// Thread 1
x = 1
queue.push(1)

// Thread 2
x = 2
queue.push(2)

Then the operations could be ordered as:

x = 1
x = 2
queue.push(1)
queue.push(2)

or

x = 1
x = 2
queue.push(2)
queue.push(1)

So having a lock-free queue alone would not suffice for thread 3 to know the value of x after the race.


Solution

  • If you know the value of x before the race began, the following code using atomic Read-Modify-Write operations should do the job.

    // Notes:
    // x == 0
    // x and winner are both atomic
    // atomic_swap swaps the content of two variables atomically, 
    // meaning, that no other thread can interfere with this operation
    
    //thread-1:
    t = 1;
    atomic_swap(x, t);
    if (t != 0) {
        //x was non zero, when thread-1 called the swap operation
        //--> thread-2 was faster
        winner = 1;
    }    
    
    //thread-2
    t = 2;
    atomic_swap(x, t);
    if (t != 0) {
        //x was non zero, when thread-2 called the swap operation
        //--> thread-1 was faster
        winner = 2;
    }  
    
    //thread-3
    while (winner == 0) {} 
    print("Winner is " + winner);