LINUX.ORG.RU

[отрыв бошки] IBM шутит ;)


0

0

Мне, как и толпе прочих лемингов дико захотелось попользоваться чем-то типа WaitForMultipleObjects в linux. В процессе розыска был найден замечательный пример реализации: http://www.ibm.com/developerworks/linux/library/l-ipc2lin3.html листинг 10. Ну, это для тех, кто понимает ;)

А вот, собственно, и сам вопрос. Есть несколько потоков, совместно работающих с общими данными. Синхронизируются они мютеком или pthread_rwlock_t или ещё чем-то. Но при этом хочется иметь возможность сказать им, что надо это дурное дело бросить и завершиться или начать новую задачу, или ещё что. Как вообще это цензурно сделать? В интернетах есть какие-то заменители WaitForMultipleObjects для linux, но те, которые я видел, ужасны. Кто как выкручивался?

Ответ на: комментарий от mannaz

Не годится, thread_cond_wait не умеет джать наступления одного из двух условий, увы.

devinull ★★
() автор топика

А в чём проблема реализовать это ручками? Что бы был порядок всегда одинаковый - отсортируй их чтоли по положению в памяти - вполне прокатит.

theos ★★★
()
Ответ на: комментарий от devinull

>А требуется одного из нескольких.

А вот с этим сложнее. Я забыл что у него два поведения (

theos ★★★
()
Ответ на: комментарий от theos

>Что бы был порядок всегда одинаковый - отсортируй их чтоли по положению в памяти - вполне прокатит

Не понял...

devinull ★★
() автор топика
Ответ на: комментарий от devinull

Ну, фишка WaitForMultiply если ждём сразу все, что бы все ждущие в одном порядке ждали. это несложно обеспечить вышеописанным спообом =) других трудностей я не вижу. Но вот если вам нужно ждать "одного из" а не "сразу все" то простыми мьютексами не обойтись ((

theos ★★★
()

может через pool'ing? ну а далее мьютексами, семафорами и прочей дрянью?

Deleted
()
Ответ на: комментарий от theos

Так о чём и речь. Те реализации, которые я видел именно до этого и опускаются ;( Можно, конечно, делать что-то типа

bool f = false;
while( !f )
{
  f = timedwait( cond, 10usec );
  if( askedToStop() )
    return;
}

но, это идиотизьм, imho. Интересно, доживём мы когда-нибудь до multithreading в linux с человеческим лицом?

devinull ★★
() автор топика
Ответ на: комментарий от theos

>А код wine читать не пробовал?

Это крайняя мера, я пока морально не готов ;) Сначала надо на 100% отчаяться ;)

devinull ★★
() автор топика


ну и не забываем, что WFMO умеет ждать в т.ч. на файловых хендлах*. что, к сожалению, так просто не эмулируется в POSIX.

*) впрочем, MSDN не рекомендует ждать именно на хендле, скажем, сокета но использовать для этого OVERLAPPED + соотв. выделенное событие. что, в принципе, почти те же яйца вид сбоку.

// wbr

klalafuda ★☆☆
()

Мне всё больше и больше нравится этот 10й листинг ;) Нафигачить потоков, каждый будет ждать своего события, а кто первым дождётся - свистнет. Оригинально. ;)

devinull ★★
() автор топика
Ответ на: комментарий от devinull

> Ну, конкретно мне вполне хватит ожидания pthread_mutex_t, pthread_cond_t и pthread_rwlock_t. Всего ничего. ;)

ну если нет необходимости реагировать на разношерстные события, тогда mutex+cond более чем достаточно. rwlock нужен, если есть объект, доступ к которому осуществляется преимущественно на чтение и лишь изредка на запись. допустим, это какой-то большой локальный кеш чего-то там или в этом духе.

впрочем, что в Win32 что в POSIX такие простые структуры будут выглядеть практически одинаково. синтаксис чуть разный но не более. если это C++, то лучше конечно взять тот же boost::thread где все это уже есть и работает и там и там.

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от devinull

> Спасибо, на boost:thread посмотрю. Сорцы вайна уже пугают ;)

нет, смотреть сорцы вайна конечно же не стоит. разве что есть непреодолимая склонность к садомазохизму.

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от devinull

Мне как раз хочется ждать, пока:

1) освободится мютеск или наступит условие, или несколько условий

2) освободится rwlock или наступит условие, или несколько условий

devinull ★★
() автор топика
Ответ на: комментарий от devinull

> Да нет, я там такого ожидания не вижу.

полной эмуляции WFMO? а его там и нет. оно делается ручками на базе mutex+condition. boost::thread же хорош тем, что это уже готовая и отлаженная обёртка, причём кросс-платформенная.

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от klalafuda

А как её можно ручками-то сделать? pthread_mutex_lock никак не прервётся никаким pthread_cond_signal. Или я чего-то не понимаю?

devinull ★★
() автор топика
Ответ на: комментарий от devinull

> А как её можно ручками-то сделать? pthread_mutex_lock никак не прервётся никаким pthread_cond_signal. Или я чего-то не понимаю?

найди лучше какой-нить туториал по разработке в многопоточном окружении. а лучше хорошую книгу. ну например:

PThreads Primer
A Guide to Multithreaded Programming
Bil Lewis, Daniel J. Berg
SunSoft Press
A Prentice Hall Title
ISBN 0-13-443698-9

там есть и мьютексы и условные переменные и все-все-все. а так же что это такое, с чем это кушают и как применяют. BTW для разных систем включая Win32 и POSIX.

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от devinull

лучше наверное сопрягать boost.asio + boost.thread для получения нужной функциональности

ott ★★★★★
()
Ответ на: комментарий от klalafuda

Что-то мне подсказывает, что в чистом виде это всё-таки не реализуется. Ибо нигде подобных примеров нет. Поясню, чего мне хочется.

extern pthread_mutex_t mutex; extern pthread_cond_t cond;

wait_for_one_of( &mutex, &const, 10 msec );

Так вот, хочется, чтобы wait_for_one_of спала, до тех пор, пока не залочит mutex или случится cond.

devinull ★★
() автор топика
Ответ на: комментарий от devinull


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

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от klalafuda

То есть, речь всё-таки о реорганизации кода, чтобы обойтись без этого?

devinull ★★
() автор топика
Ответ на: комментарий от devinull

только что хотел это предложить! (по ссылкам не ходил)

yoghurt ★★★★★
()
Ответ на: комментарий от klalafuda

> впрочем, MSDN не рекомендует ждать именно на хендле, скажем, сокета но использовать для этого OVERLAPPED + соотв. выделенное событие

Есть же GetQueuedCompletionStatus

nikolayd
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.