Войти в систему

Home
    - Создать дневник
    - Написать в дневник
       - Подробный режим

LJ.Rossia.org
    - Новости сайта
    - Общие настройки
    - Sitemap
    - Оплата
    - ljr-fif

Редактировать...
    - Настройки
    - Список друзей
    - Дневник
    - Картинки
    - Пароль
    - Вид дневника

Сообщества

Настроить S2

Помощь
    - Забыли пароль?
    - FAQ
    - Тех. поддержка



Пишет yigal_s ([info]yigal_s)
@ 2013-01-31 22:05:00


Previous Entry  Add to memories!  Tell a Friend!  Next Entry
Неожиданно обнаружил очень давно увиденный и, казалось, навсегда потерянный очень приятный текст: "Multithreaded Programming Guide" от Sun

Вот тут http://www4.ncsu.edu/~rhee/clas/csc495j/MultithreadedProgrammingGuide_Solaris24.pdf от 1994-го еще года,

а тут http://docs.oracle.com/cd/E19253-01/816-5137/816-5137.pdf за 2008-й год, раза в полтора потолще.

Пожалуй, неплохое введение в кондвары (наверное, я так думаю, потому что в этой книге впервые о них внятно прочитал). Впрочем, в документе есть ряд довольно сомнительных мест, способных, пожалуй, и запутать.

Помимо скорее уже ошибочных мест, мне вот этот пассаж не понятен:

This function [pthread_cond_wait] blocks until the condition is signaled. The function atomically releases the associated mutex lock before blocking, and atomically acquires the mutex again before returning.

Вот это второе "atomically" несколько непонятно, при том, что в Sun-овской документации http://www.manpages.info/sunos/pthread_cond_wait.3.html его вообще нет. Что они понимают под этой атомарностью? Т.е. может они мютекс перебрасывают от одного треда к другому от того треда, который просигналил - к тем, которые сигнал приняли, но ведь просигналить можно и за пределами мютекса, так что... Вообще, гадать можно, но что ж они на самом деле в виду имели?

Вот еще забавный пассажик, надолго извративший понимание темы (оно до сих пор извращено):

Since pthread_cond_broadcast() causes all threads blocked on the condition to contend again for the mutex lock, use pthread_cond_broadcast() with care.

На самом деле, это pthread_cond_signal надо использовать с осторожностью, а если вам приходится с острожностью использовать pthread_cond_broadcast - это скорее всего означает, что у вас ошибочный код. Вообще, pthread_cond_broadcast должна бы по идее объясняться первой и быть "дефолтной" функцией сигнализации, а pthread_cond_signal вводиться как некая опасная оптимизация, частный специализированный случай броадкаста. Но такой взгляд на вещи пока распространения не получил.


(Добавить комментарий)


[info]spamsink@lj
2013-02-01 01:50 (ссылка)
Может, они имели в виду, что проснется ровно один тред, а потом осознали, что это в общем случае не так?

(Ответить) (Ветвь дискуссии)


[info]yigal_s@lj
2013-02-01 02:01 (ссылка)
так ведь даже один тред можно засигналить, не удерживая при этом мютекс, и что в этом случае означает атомарность (во втором случае) по прежднему не ясно.

Ну да, был там какой-то классический-допотопный вариант монитора Хоара, когда после сигнала управление сразу переводилось на ждущий тред, но каким боком это к современному кондвару опять не понятно.

В идеале можно себе представить, что если засигналить кондвар из-под мютекса, то тогда ждущие треды получат этот мютекс по очереди один за одим и раньше всех других - это довольно забавно было бы иметь, но как-то не очень верится, что Sun озаботится подобной весьма дорогостоящей ловлей блох.

(Ответить) (Уровень выше)