 
                            ...
The C++ Standard, [thread.mutex.class], paragraph 5 [ISO/IEC 14882-2014], states the following:
The behavior of a program is undefined if it destroys a
mutexobject owned by any thread or a thread terminates while owning amutexobject.
...
This compliant solution eliminates the race condition by extending the lifetime of the mutex:.
| Code Block | ||||
|---|---|---|---|---|
| 
 | ||||
| #include <mutex>
#include <thread>
const size_t maxThreads = 10;
void do_work(size_t i, std::mutex *pm) {
  std::lock_guard<std::mutex> lk(*pm);
  // Access data protected by the lock.
}
std::mutex m;
void start_threads() {
  std::thread threads[maxThreads];
  for (size_t i = 0; i < maxThreads; ++i) {
    threads[i] = std::thread(do_work, i, &m);
  }
}
 | 
...
This compliant solution eliminates the race condition by joining the threads before the mutex's destructor is invoked:.
| Code Block | ||||
|---|---|---|---|---|
| 
 | ||||
| #include <mutex>
#include <thread>
const size_t maxThreads = 10;
void do_work(size_t i, std::mutex *pm) {
  std::lock_guard<std::mutex> lk(*pm);
  // Access data protected by the lock.
}
void run_threads() {
  std::thread threads[maxThreads];
  std::mutex m;
  for (size_t i = 0; i < maxThreads; ++i) {
    threads[i] = std::thread(do_work, i, &m);
  }
  for (size_t i = 0; i < maxThreads; ++i) {
    threads[i].join();
  }
} | 
...
Destroying a mutex while it is locked may result in invalid control flow and data corruption.
| Rule | Severity | Likelihood | 
|---|
| Detectable | Repairable | Priority | Level | 
|---|---|---|---|
| CON50-CPP | Medium | Probable | No | 
| No | P4 | L3 | 
Automated Detection
| Tool | Version | Checker | Description | ||||||
|---|---|---|---|---|---|---|---|---|---|
| CodeSonar | 
 | CONCURRENCY.LOCALARG | Local Variable Passed to Thread | ||||||
| Helix QAC | 
 | DF961, DF4962 | |||||||
| Klocwork | 
 | CERT.CONC.MUTEX.DESTROY_WHILE_LOCKED | |||||||
| Parasoft C/C++test | 
 | CERT_CPP-CON50-a | Do not destroy another thread's mutex | ||||||
| Polyspace Bug Finder | 
 | CERT C++: CON50-CPP | Checks for destruction of locked mutex (rule partially covered) | 
Related Vulnerabilities
Search for vulnerabilities resulting from the violation of this rule on the CERT website.
Related Guidelines
| MITRE CWE | CWE-667, Improper Locking | 
| SEI CERT C Coding Standard | CON31-C. Do not destroy a mutex while it is locked | 
Bibliography
| [ISO/IEC 14882-2014] | Subclause 30.4.1, "Mutex Requirements" | 
...