Здравствуйте, 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 не было возможности его реализовать удобно, поэтому цикл всегда приходится выносить в пользовательский код. Но это фактически не более чем деталь реализации, если управление не вышло из цикла проверки предиката, то фактически ничего и не произошло.
Здравствуйте, 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 не было возможности его реализовать удобно, поэтому цикл всегда приходится выносить в пользовательский код. Но это фактически не более чем деталь реализации, если управление не вышло из цикла проверки предиката, то фактически ничего и не произошло.
Ну где учат так заворачивать фразы. ума на приложу
Здравствуйте, OdesitVadim, Вы писали:
R>>Ожидание на условной переменной может быть реализовано просто как pthread_yield(). Или даже если оно действительно ждёт чего-то, то оно может возвращаться без видимых причин на то. Т.о. выход из pthread_cond_wait() практически ничего не значит, а это именно то, что делает pthread_cond_signal(). OV>То, что оно может возвратиться, я в курсе. у меня там теперь допусловие. Если с wait вышли, то проверим, а не конец ли это, не выставлен ли флаг завершения работы. OV>Кто же в данном случае предикат? мютекс mtx, размер очереди data или state ? или все вместе? 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>Ну где учат так заворачивать фразы. ума на приложу
Ну где учат так тему переводить. ума на приложу
R>cv.wait(lock, [&](){ return data.not_empty() || state != stWork; });
R>
R>И если теперь ты будешь просто так звать notify/broadcast, то управление из функции wait() даже не будет к тебе возвращаться.
Кажеться мне, это не С++, а как минимум С++++ или С++нечто Это по новому стандарту? Так писать не буду пока точно, и начальство не поймет юмора, и некоторые компиляторы, где код должен собираться.
Здравствуйте, OdesitVadim, Вы писали:
R>>Если переписать это на С++, то это будет: R>>
R>>cv.wait(lock, [&](){ return data.not_empty() || state != stWork; });
R>>
R>>И если теперь ты будешь просто так звать notify/broadcast, то управление из функции wait() даже не будет к тебе возвращаться. OV>Кажеться мне, это не С++, а как минимум С++++ или С++нечто Это по новому стандарту? Так писать не буду пока точно, и начальство не поймет юмора, и некоторые компиляторы, где код должен собираться.
Это всё очень остроумно, но не имеет отношения к делу.