...
Code Block | ||||
---|---|---|---|---|
| ||||
#include <Windows.h> #include <stdio.h> CRITICAL_SECTION lock; CONDITION_VARIABLE cond; DWORD WINAPI run_step(LPVOID t) { static size_t current_step = 0; size_t my_step = (size_t)t; EnterCriticalSection(&lock); printf("Thread %d has the lock\n", my_step); while (current_step != my_step) { printf("Thread %d is sleeping...\n", my_step); if (!SleepConditionVariableCS(&cond, &lock, INFINITE)) { /* Handle error */ } printf("Thread %d woke up\n", my_step); } /* Do processing ... */ printf("Thread %d is processing...\n", my_step); current_step++; LeaveCriticalSection(&lock); /* Signal ALL waiting tasks */ WakeAllConditionVariable(&cond); printf("Thread %d is exiting...\n", my_step); return 0; } enum { NTHREADS = 5 }; int main(void) { HANDLE threads[NTHREADS]; InitializeCriticalSection(&lock); InitializeConditionVariable(&cond); /* Create threads */ for (size_t i = 0; i < NTHREADS; ++i) { threads[i] = CreateThread(NULL, 0, run_step, (LPVOID)i, 0, NULL); } /* Wait for all threads to complete */ WaitForMultipleObjects(NTHREADS, threads, TRUE, INFINITE); DeleteCriticalSection(&lock); return 0; } |
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).
...
Related Vulnerabilities
Search for vulnerabilities resulting from the violation of this rule on the CERT website.
Related Guidelines
CERT Oracle Secure Coding Standard for Java | THI04-J. Notify all waiting threads rather than a single thread |
...