https://thispointer.com/c-11-multithreading-part-1-three-different-ways-to-create-threads/
https://stackoverflow.com/questions/3513045/conditional-variable-vs-semaphore
https://en.cppreference.com/w/cpp/thread/condition_variable
https://thispointer.com/c11-multithreading-part-7-condition-variables-explained/