我有一个来自循环缓冲区的pthread处理数据。当它完成时,我发信号通知另一个线程,它现在可以处理缓冲区。因此,基本架构是以串行方式处理数据的2个pthread。第二个线程处于一个循环中,阻塞如下:
pthread_mutex_lock(pMutex);
pthread_cond_wait(pCondition, pMutex);
pthread_mutex_unlock(pMutex);
在我的第一个线程完成处理特定缓冲区后,它会发出第二个线程的信号:
pthread_mutex_lock(m_pEncodeLeftMutex);
pthread_cond_signal(&m_cvEncodeLeft);
pthread_mutex_unlock(m_pEncodeLeftMutex);
这一切似乎都运转得很好。
现在我正在尝试了解C ++模式,因此我想将此代码迁移到C ++。我首先玩的模式(因为它是最简单的)是Wrapper Facade模式。所以我想使用Wrapper Facade作为互斥/条件变量。这是我对条件变量的作用:
class ConditionVariable
{
public:
ConditionVariable(class Mutex &);
~ConditionVariable();
inline int waitForCondition() {
pthread_cond_wait(&m_tCondition, m_tMutex.m_pMutex);
return m_nPassedData;
}
inline void signalCondition(int x) {
pthread_cond_signal(&m_tCondition);
m_nPassedData = x;
}
private:
// by defining the copy ctor, the assigmnent opterator, and default ctor
// as private, this will disable copying, assignment, and invalid use
ConditionVariable(const ConditionVariable &);
void operator= (const ConditionVariable &);
ConditionVariable();
int m_nPassedData;
pthread_cond_t m_tCondition;
class Mutex &m_tMutex;
};
我想将第一个线程处理的循环缓冲区索引传递给第二个线程。我的问题是关于以这种方式传递的数据。 m_nPassedData是否受互斥锁保护?如果第二个pthread需要额外的长时间处理缓冲区并因此释放互斥锁,那么第一个pthread会阻塞它,因为它无法获得互斥锁吗?