Queue
スレッドセーフにしようとしたクラスがあります。次の3つのメンバー変数があります。
std::queue<T> m_queue;
pthread_mutex_t m_mutex;
pthread_cond_t m_condition;
プッシュアンドポップは次のように実装されます。
template<class T> void Queue<T>::push(T value)
{
pthread_mutex_lock( &m_mutex );
m_queue.push(value);
if( !m_queue.empty() )
{
pthread_cond_signal( &m_condition );
}
pthread_mutex_unlock( &m_mutex );
}
template<class T> bool Queue<T>::pop(T& value, bool block)
{
bool rtn = false;
pthread_mutex_lock( &m_mutex );
if( block )
{
while( m_queue.empty() )
{
pthread_cond_wait( &m_condition, &m_mutex );
}
}
if( !m_queue.empty() )
{
value = m_queue.front();
m_queue.pop();
rtn = true;
}
pthread_mutex_unlock( &m_mutex );
return rtn;
}
残念ながら、このコードのせいである可能性のある問題が時折あります。つまり、2つのスレッドがあり、キューが空ではないのに、スレッド1が出てこない場合push()
と、スレッド2が出ていない場合pop()
(block
パラメーターは)があります。true
他にも利用可能な実装があることは理解していますが、必要に応じてこのコードを修正してみたいと思います。誰か問題がありますか?
コンストラクターには適切な初期化があります。
Queue()
{
pthread_mutex_init( &m_mutex, NULL );
pthread_cond_init( &m_condition, NULL );
}
そしてデストラクタ、対応する'destroy'が呼び出します。