When modifying shared state in multithreaded code, implement proper checks and state transitions to prevent race conditions. This applies to flags, counters, and resource management.
Bad:
// Don't check flags without thread safety
if (m_terminationFlags & TerminatedFlag) {
// Already terminated, skip work
return;
}
// Race condition: Another thread might have set the flag between check and action
Good:
// Use atomic operations and check the return value
if (atomic_fetch_or(&m_terminationFlags, TerminatedFlag) & TerminatedFlag) {
// Already terminated, skip work
return;
}
// For multi-step processes, track completion:
protectedThis->m_messagesInFlight -= 1;
if (protectedThis->m_messagesInFlight == 0)
protectedThis->close(); // Only close when all messages are processed
Enter the URL of a public GitHub repository