- 论坛徽章:
- 0
|
首先这样的代码不安全, 因为线程有可能被signal打断,这样就会锁死。
in signal
mutex_lock(&m);
....
mutex_unlock(&m);
in thread
mutex_lock(&m);
....
mutex_unlock(&m);
然而condition很难实现的那么单纯,不排除上述类似mutex的情况,锁死就很可能了。
这是boost 1.33中的condition signal的实现,里面也有mutex lock.
- void condition_impl::notify_one()
- {
- unsigned signals = 0;
- int res = 0;
- res = WaitForSingleObject(reinterpret_cast<HANDLE>(m_mutex), INFINITE);
- assert(res == WAIT_OBJECT_0);
- if (m_waiting != 0) // the m_gate is already closed
- {
- if (m_blocked == 0)
- {
- res = ReleaseMutex(reinterpret_cast<HANDLE>(m_mutex));
- assert(res);
- return;
- }
- ++m_waiting;
- --m_blocked;
- signals = 1;
- }
- else
- {
- res = WaitForSingleObject(reinterpret_cast<HANDLE>(m_gate), INFINITE);
- assert(res == WAIT_OBJECT_0);
- if (m_blocked > m_gone)
- {
- if (m_gone != 0)
- {
- m_blocked -= m_gone;
- m_gone = 0;
- }
- signals = m_waiting = 1;
- --m_blocked;
- }
- else
- {
- res = ReleaseSemaphore(reinterpret_cast<HANDLE>(m_gate), 1, 0);
- assert(res);
- }
- }
- res = ReleaseMutex(reinterpret_cast<HANDLE>(m_mutex));
- assert(res);
- if (signals)
- {
- res = ReleaseSemaphore(reinterpret_cast<HANDLE>(m_queue), signals, 0);
- assert(res);
- }
- }
复制代码 |
|