...
Code Block | ||||
---|---|---|---|---|
| ||||
#include <condition_variable> #include <iostream> #include <mutex> #include <thread> constexpr size_t numThreads = 5; std::mutex mutex; std::condition_variable cond[numThreads]; void run_step(size_t myStep) { static size_t currentStep = 0; std::unique_lock<std::mutex> lk(mutex); std::cout << "Thread " << myStep << " has the lock" << std::endl; while (currentStep != myStep) { std::cout << "Thread " << myStep << " is sleeping..." << std::endl; cond[myStep].wait(lk); std::cout << "Thread " << myStep << " woke up" << std::endl; } // Do processing ... std::cout << "Thread " << myStep << " is processing..." << std::endl; currentStep++; // Signal next step thread. if ((myStep + 1) < numThreads) { cond[myStep + 1].notify_one(); } std::cout << "Thread " << myStep << " is exiting..." << std::endl; } int main() { std::thread threads[numThreads]; // Create threads... for (size_t i = 0; i < numThreads; ++i) { threads[i] = std::thread(run_step, i); } // Wait for all threads to complete. for (size_t i = numThreads; i != 0; --i) { threads[i - 1].join(); } return 0; }main() unchanged ... |
Risk Assessment
Failing to preserve the thread safety and liveness of a program when using condition variables can lead to indefinite blocking and denial of service (DoS).
...