Два потока, один дергает WaitAndPopInfo, второй Push. Может ли компилятор прооптимизировать while(
m_queue.empty() ) до while(true/false)?
typedef boost::condition_variable condition_variable_t;
typedef boost::shared_ptr<condition_variable_t> condition_variable_ptr_t;
boost::mutex m_mutex;
condition_variable_ptr_t m_ptrCondition;
std::queue< size_t > m_queue;
bool boo::TryPopInfo( size_t& areaId )
{
boost::mutex::scoped_lock lock( m_mutex );
if ( m_queue.empty() )
return false;
areaId = m_queue.front();
m_queue.pop();
return true;
}
bool CAreaIdSink::WaitAndPopInfo( stream_size_t& areaId )
{
{
boost::mutex::scoped_lock lock( m_mutex );
while( m_queue.empty() )
{
boost::system_time const timeoutAbsTime = boost::get_system_time() + boost::posix_time::milliseconds( queueConditionTimeout );
m_ptrCondition->timed_wait( lock, timeoutAbsTime );
}
}
return TryPopInfo( areaId );
}
void CAreaIdSink::Push( cnt::byte_array_ptr_t ptrBuf )
{
cnt::CBufReader reader( ptrBuf );
boost::mutex::scoped_lock lock( m_mutex );
stream_size_t areaId = reader.ReadUlong();
m_queue.push( areaId );
m_ptrCondition->notify_all();
}
Я не вижу тут проблем, доступ к очереди всегда защищён. Наличие лока мешает проводить оптимизацию, которую вы описали. Почему родился вопрос?))
Здравствуйте, uzhas, Вы писали:
U>Я не вижу тут проблем, доступ к очереди всегда защищён. Наличие лока мешает проводить оптимизацию, которую вы описали. Почему родился вопрос?))
Видимо пятница-вечер родила этот вопрос
Здравствуйте, dcb_BanDos, Вы писали:
_BD> Может ли компилятор прооптимизировать while( m_queue.empty() ) до while(true/false)?
timed_wait, как и wait внутри себя отпускает мьютекс, а потом снова захватывают.
(в этом отпускании/захвате и есть те самые барьеры, запрещающие думать, что m_queue.empty() не поменялся.
boost::mutex::scoped_lock lock( m_mutex );
while( m_queue.empty() )
{
boost::system_time const timeoutAbsTime = boost::get_system_time() + boost::posix_time::milliseconds( queueConditionTimeout );
m_ptrCondition->timed_wait( lock, timeoutAbsTime );
}