77725.fb2 Bash.org.ru IT Happens Истории ## 1 - 800 - читать онлайн бесплатно полную версию книги . Страница 375

Bash.org.ru IT Happens Истории ## 1 - 800 - читать онлайн бесплатно полную версию книги . Страница 375

#374: А делать-то нам нечего!

17 декабря 2008, 11:00. рейтинг: 1255

Наверняка вы знаете, что часто причиной тормозов некоторых коммерческих программ являются закладки в коде типа:

for(i = 0; i < 100000000; i++);

на самых часто используемых операциях: отрисовка окна, реакция на событие и т.д. Но иногда бывают случаи, когда подобная закладка несет полезную нагрузку.

Итак, нужно было сделать курсовую, иллюстрирующую, как несколько потоков разделяют общей ресурс – очередь. Одновременно потоки добавляют в очередь дан ные, а затем считывают из нее то, что добавили. Реализовал на C в Knoppix с использование pthread. Но веселье началось, когда я понял, судя по выводу проги, что потоки выполняются не одновременно, а поочередно.

Два дня и две ночи разбирался в чем дело. Поставил вывод промежуточных результатов после каждого добавления в очередь. Смотрю в логи – работают потоки одновременно, в очередь кидают как надо данные – все в порядке. К слову, сема форы у меня стояли правильно и никаких потерей указателя на очередь не было. Вырубаю ведение логов – потоки упрямо идут друг за дружкой.

После 5-часовой медитации и курения исходников до меня дошло – ведение логов и заставляло прогу работать правильно! При операциях ввода-вывода между добавле нием данных в очередь теряется часть времени достаточная, чтобы хоть немного потоки поработали вместе.

После добавления аналога: for(i = 0; i < 100000000; i++) в поток, я заплакал над убитыми впустую выходными...