我可以使用Wrapper Facade类中的pthread条件变量传递一些数据吗?

时间:2014-01-31 02:52:33

标签: c++ multithreading design-patterns pthreads

我有一个来自循环缓冲区的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会阻塞它,因为它无法获得互斥锁吗?

0 个答案:

没有答案