суббота, 27 августа 2011 г.

Art of Concurrency

я канешна давно забыл закон Ома все те крайне немногочисленные алгоритмы, которым меня пытались научить во времена молодости царя гороха, но есть мнение, что алгоритм Блюма-Флойда-Пратта-Ривеста-Тарьяна реализован в главе 6 дико неоптимально. Например совершенно непонятно зачем выделять массив целых чисел markS чтобы положить туда флаг принадлежности к множеству. Меня например также учили, что выделение памяти достаточно дорогая операция и в данном случае можно было бы обойтись без нее, переписав функцию ArrayPack без использования этого массива с парой лишних сравнений для каждого элемента. Кроме того, выделенная память нигде не освобождается.
Что еще угарнее - название использованного алгоритма так и не приводится в книжке. Пребываю в легком недоумении

Update: а реализация барьеров в главе 7 совершенно безобразна. Вместо того чтобы сначала взвести все переменные и только потом вызывать pthread_cond_broadcast, гражданин вводит лишнюю сущность color. Только это не работает
Предположим что после вызова pthread_cond_broadcast текущий поток вытесняется и один из проснувшихся потоков повторно входит в барьер, уменьшая значение счетчика (который становится -1). Поток соотв-но встает на pthread_cond_wait. Затем исходный поток оживает, сбрасывает count в numThreads и идет по своим делам. Итого - один поток потерялся навсегда и
все последующие потоки будут тупить на его реализации барьера вечно
И еще было бы неплохо объявить поле numThreads в структуре pth_barrier_t как volatile, а то малоличо

Комментариев нет:

Отправить комментарий