Re[11]: реализация читатели-писатель
От: remark Россия http://www.1024cores.net/
Дата: 28.04.10 07:53
Оценка:
Здравствуйте, OdesitVadim, Вы писали:

OV>Здравствуйте, remark, Вы писали:

OV>[scip]
R>>Мы говорим об одной и той же условной переменной.
OV>[scip]
R>>Интерфейс POSIX ограничен С,

OV>Но работает так как я написал?


И да и нет.
Ожидание на условной переменной может быть реализовано просто как pthread_yield(). Или даже если оно действительно ждёт чего-то, то оно может возвращаться без видимых причин на то. Т.о. выход из pthread_cond_wait() практически ничего не значит, а это именно то, что делает pthread_cond_signal().

R>>если же ты посмотришь любую нормальную реализацию условных переменных для С++, то они принимают предикат, которого ждём. При использовании такого АПИ, ожидающий поток даже и не выйдёт из фунукции ожидания при сигнализировании без изменения сосотояния предикаита.


OV>тоесть буста?


Почему обязательно буста? Можешь поглядеть C++0x, just::thread, Threading Building Blocks.
Ожидание с предикатом — это естественный подразумеваемый интерфейс, просто в POSIX не было возможности его реализовать удобно, поэтому цикл всегда приходится выносить в пользовательский код. Но это фактически не более чем деталь реализации, если управление не вышло из цикла проверки предиката, то фактически ничего и не произошло.


1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[12]: реализация читатели-писатель
От: OdesitVadim Украина  
Дата: 28.04.10 08:19
Оценка:
Здравствуйте, remark, Вы писали:

OV>>[scip]


R>Ожидание на условной переменной может быть реализовано просто как pthread_yield(). Или даже если оно действительно ждёт чего-то, то оно может возвращаться без видимых причин на то. Т.о. выход из pthread_cond_wait() практически ничего не значит, а это именно то, что делает pthread_cond_signal().

То, что оно может возвратиться, я в курсе. у меня там теперь допусловие. Если с wait вышли, то проверим, а не конец ли это, не выставлен ли флаг завершения работы.
Кто же в данном случае предикат? мютекс mtx, размер очереди data или state ? или все вместе?
while (data.empty()) {
      if (state != stWork)
        break;
      cv.wait(mtx);
    }


[scip]

OV>>тоесть буста?


R>Почему обязательно буста? Можешь поглядеть C++0x, just::thread, Threading Building Blocks.

вот о третьем я что то не слышал...
R>Ожидание с предикатом — это естественный подразумеваемый интерфейс, просто в POSIX не было возможности его реализовать удобно, поэтому цикл всегда приходится выносить в пользовательский код. Но это фактически не более чем деталь реализации, если управление не вышло из цикла проверки предиката, то фактически ничего и не произошло.
Ну где учат так заворачивать фразы. ума на приложу
Re[13]: реализация читатели-писатель
От: remark Россия http://www.1024cores.net/
Дата: 28.04.10 08:27
Оценка:
Здравствуйте, OdesitVadim, Вы писали:

R>>Ожидание на условной переменной может быть реализовано просто как pthread_yield(). Или даже если оно действительно ждёт чего-то, то оно может возвращаться без видимых причин на то. Т.о. выход из pthread_cond_wait() практически ничего не значит, а это именно то, что делает pthread_cond_signal().

OV>То, что оно может возвратиться, я в курсе. у меня там теперь допусловие. Если с wait вышли, то проверим, а не конец ли это, не выставлен ли флаг завершения работы.
OV>Кто же в данном случае предикат? мютекс mtx, размер очереди data или state ? или все вместе?
OV>
OV>while (data.empty()) {
OV>      if (state != stWork)
OV>        break;
OV>      cv.wait(mtx);
OV>    }
OV>


Вот предикат — то, чего ты ждёшь:
while ( ! (data.not_empty() || state != stWork))
      cv.wait(mtx);


Соответственно сигнализировать ты будешь только если ты [потенциально] меняешь состояние предиката:
data.enqueue(msg);
cv.notify_one();

и:
state = stStop;
cv.notify_all();



OV>>>тоесть буста?


R>>Почему обязательно буста? Можешь поглядеть C++0x, just::thread, Threading Building Blocks.

OV>вот о третьем я что то не слышал...
R>>Ожидание с предикатом — это естественный подразумеваемый интерфейс, просто в POSIX не было возможности его реализовать удобно, поэтому цикл всегда приходится выносить в пользовательский код. Но это фактически не более чем деталь реализации, если управление не вышло из цикла проверки предиката, то фактически ничего и не произошло.
OV>Ну где учат так заворачивать фразы. ума на приложу
Ну где учат так тему переводить. ума на приложу


1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[14]: реализация читатели-писатель
От: remark Россия http://www.1024cores.net/
Дата: 28.04.10 08:30
Оценка:
Здравствуйте, remark, Вы писали:

R>Вот предикат — то, чего ты ждёшь:

R>
R>while ( ! (data.not_empty() || state != stWork))
R>      cv.wait(mtx);
R>


Если переписать это на С++, то это будет:
cv.wait(lock, [&](){ return data.not_empty() || state != stWork; });

И если теперь ты будешь просто так звать notify/broadcast, то управление из функции wait() даже не будет к тебе возвращаться.


1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[15]: реализация читатели-писатель
От: OdesitVadim Украина  
Дата: 28.04.10 08:42
Оценка:
Здравствуйте, remark, Вы писали:


R>Если переписать это на С++, то это будет:

R>
R>cv.wait(lock, [&](){ return data.not_empty() || state != stWork; });
R>

R>И если теперь ты будешь просто так звать notify/broadcast, то управление из функции wait() даже не будет к тебе возвращаться.
Кажеться мне, это не С++, а как минимум С++++ или С++нечто Это по новому стандарту? Так писать не буду пока точно, и начальство не поймет юмора, и некоторые компиляторы, где код должен собираться.
Re[16]: реализация читатели-писатель
От: remark Россия http://www.1024cores.net/
Дата: 28.04.10 08:48
Оценка:
Здравствуйте, OdesitVadim, Вы писали:

R>>Если переписать это на С++, то это будет:

R>>
R>>cv.wait(lock, [&](){ return data.not_empty() || state != stWork; });
R>>

R>>И если теперь ты будешь просто так звать notify/broadcast, то управление из функции wait() даже не будет к тебе возвращаться.
OV>Кажеться мне, это не С++, а как минимум С++++ или С++нечто Это по новому стандарту? Так писать не буду пока точно, и начальство не поймет юмора, и некоторые компиляторы, где код должен собираться.

Это всё очень остроумно, но не имеет отношения к делу.


1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.