Столкнулся с проблемой.
вот код
struct work_t
{
std::deque<int> data;
boost::mutex * mutex;
};
std::vector<work_t> work_data;
void worker (const int & n)
{
std::ofstream ostr(...);
while(!stop)
{
int s = 0;
{
boost::mutex::scoped_lock lk(*(work_data[n].mutex));
if(!work_data[n].data.empty())
{
s = work_data[n].data.front();
work_data[n].data.pop_front();
}
}
if(s != 0)
{
do_some_work(s);
}
if(have_results)
{
write_results(ostr);
}
}
}
int main()
{
//...
// Заполнение и инициализация массива work_data
//..
boost::thread_group grp;
for(int i=0;i<nthread;++i)
{
grp.create_thread(boost::bind(&worker,i));
}
grp.join_all();
//...
}
Каждый поток работает со своей порцией данных.
mutex защищающий данные потока, на данный момент, всегда свободен. Т.е. поток никогда не должен в нем засыпать.
Если я запускаю 4 потока на машине с AMD Athlon64 3000, то в htop
видно что все потоки находятся в состоянии R и отбирают 100%
процессорного времени, которое делится между потоками. Вроде все
нормально.
Но если эти же 4 потока, на тех же самых данных запустить на 4-х
процессорной машине с DualCore Opteron 875, то загрузка на всех
процесорах не превышает 50% и одновременно работает только 1 или 2
потока остальные висят в состоянии D (насколько я понял это означает
что поток заблокирован).
Кто-нибудь может мне объяснить с чем связано такое поведение?
Хочется все-таки загрузить машину по полной.
Ответ на:
комментарий
от e
Ответ на:
комментарий
от e
Ответ на:
комментарий
от anonymous
Ответ на:
комментарий
от Vinick
Ответ на:
комментарий
от anonymous
Ответ на:
комментарий
от Vinick
Ответ на:
комментарий
от Die-Hard
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
Похожие темы
- Форум BOOST thread не понимаю ... (2011)
- Форум Boost.Asio и несколько async_write/async_read за раз (2023)
- Форум SMP (2009)
- Форум smp (2007)
- Форум SMP (2005)
- Форум smp? (2001)
- Форум SMP (2005)
- Форум SMP (2005)
- Форум Архиваторы&SMP (2010)
- Форум Отключение SMP (2010)