Q1: Are pseudo random number generators thread safe? Can I use a shared generator in multiple threads?
#include "stdafx.h" #include <iostream> #include <thread> #include <random> #include <math.h> using namespace std; random_device seed;//Should I use thread_local here? default_random_engine engine(seed());//Should I use thread_local here? int random_int(int x, int y) { binomial_distribution<int> distribution(y - x); return distribution(engine) + x; } int a[10],b[10],c[10]; void thread_task() { for (int i = 0; i < 10; i++) { a[i] = random_int(1, 8); } } void thread_task1() { for (int i = 0; i < 10; i++) { b[i] = random_int(1, 8); } } void thread_task2() { for (int i = 0; i < 10; i++) { c[i] = random_int(1, 8); } } int main() { thread t(thread_task); thread t1(thread_task1); thread t2(thread_task2); t.join(); t1.join(); t2.join(); for (int i = 0; i < 10; i++) cout << a[i] << " "; cout << endl; for (int i = 0; i < 10; i++) cout << b[i] << " "; cout << endl; for (int i = 0; i < 10; i++) cout << c[i] << " "; cout << endl; getchar(); return 0; } result 1: 7 4 4 3 7 5 4 4 4 4 5 4 4 7 2 3 6 5 4 7 4 4 4 6 1 6 3 5 3 4 //seems fine. result 2: 5 3 5 6 3 4 5 5 3 5 5 6 5 6 8 3 5 7 3 2 4 6 4 5 4 4 4 3 6 7 //still works fine. Q2: Does thread safe means lock-free?
If a class is thread safe, then does that mean I can use a shared instance of it in multiple threads without locking it?
Q3: I didn't use either a lock or a thread_local keyword, it still generates different integer sequences for different threads, then what's a lock good for?