I have copied Sandro's code and added thread-safety using the C++ (with standard at least c++11) headers <thread> and <mutex>. In the header file
thread_safe_random.hpp
, the functions RANDOM
and Seed
are declared.
The C++ file
thread_safe_random.cpp
defines the functions RANDOM
and Seed
,
and the RNG and uniform distribution as before. Additionally, a mutex my_rng_mutex
is defined to guard my_rng
.
I am using a lock_guard
to lock and release the mutex. When one thread of execution calls the function RANDOM
,
it acquires the mutex. Any other thread that calls RANDOM
, has to wait until the mutex is released.
In order to demonstrate
thread_safe_random
, I created max
threads in the main
function
that use the auxiliary function fetch_random_number
to call RANDOM
.
The result should look like
$ g++ --std=c++11 -pthread main.cpp thread_safe_random.cpp -o test_safe_random $ ./test_safe_random 0.284779 0.243487 0.161906 0.338338 0.235765 0.502853 0.389262 0.165401 0.244871 0.194046However, the order of these numbers can change each time you execute the program. This means that the program is no longer deterministic (although we can argue about what it means to be deterministic or not), because the OS determines the order in which the threads call
RANDOM
.
Another problem with this implementation is that it will be slow when each thread needs many random numbers.