LINUX.ORG.RU

WaitForMultipleObjects = ?


0

1

Эта прекрасная виндовая функция, которая позволяла мирно завершать поток: одному или нескольким событиям поток выполнял заданые действия, а по другому можно было мирно завершиться. В линуксе такого обнаружить не удалось: pthread_cond_wait позволяет ждать только одного события. В свое время меня учили, что за функции типа pthread_cancel обычно выдирают руки из ж... Так как можно красиво сделать так, чтобы в нужный момент поток завершился сам?


Это зависит от того, что твой поток делает. Если это, к примеру, сервер.. то надо к нему приконектиться и послать shutdown request. Для того, чтобы подождать его завершение использовать симафор (pthread_cond_wait).

Сложно сказать, не зная алгоритма =) Если у тебя прекрасно все получалось с WaitForMultipleObjects то придумай сам какой-то класс, который будет ждать сигнала от нескольких семафоров.

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

в принципе, можно select/poll заиспользовать

jek_
()
Ответ на: комментарий от anonymous

Если подробнее, нужно pthread_cond_waitdtime() для нескольких pthread_cond_t по схеме "или" ("и"-то сделать элементарно) Работать это должно так: while(1) { int result = pthread_multi_cond_wait(...); switch(result) { case 0: doSomething1(); break; case 1: doSomething2(); break; ... case n: return; } } По событию n поток мирно завершается сам. Мне, в принципе, нужно только два события - одно для выполнения работы, другое - для выхода. Использовать select не получится - он для файлового ввода-вывода.

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

> Я бы использовал ACE Что-то это больно крутое. Для моей задачи - перебор.

Varcom
() автор топика

Как вариант можно использовать pthread_cond_wait в чистом виде как он есть, НО! перед g_cond_broadcast выставлять некую переменную с типом описывающее происходящее, чтобы рабочий поток уже сам решил как ему поступить дальше. Ориентировочно это может выглядеть так:

typedef enum {SOMEJOB,SHUTDOWN} CondType volatile CondType condtype;

GMutex * work_mutex; GCond * work_cond;

....

gpointer worktread(gpointer * data) { CondType ct; while (1) { g_mutex_lock(work_mutex); g_cond_wait(work_cond,work_mutex); ct=condtype; g_mutex_unock(work_mutex); if (ct==SOMEJOB) {...}; if (ct==SHUTDOWN) break; } };

//гдето в потоке которому нужно запросить выполнение работы: g_mutex_lock(work_mutex); condtype=SOMEJOB; g_cond_broadcast(work_cond); g_mutex_unlock(work_mutex);

//в случае необходимого завершения потока: g_mutex_lock(work_mutex); condtype=SHUTDOWN; g_cond_broadcast(work_cond); g_mutex_unlock(work_mutex); pthread_join(....); //здесь поток worktread уже явно завершен

P.S. в тесте могут быть синтаксические ошибки, набирал без проверки компилятором.

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

Спасибо. Кстати, аналогичный вариант нашел в книжке Advanced Linux Programming: http://www.advancedlinuxprogramming.com. Входное событие одно, а нужное действие выбираем по внешней переменной, которая защищается мьютексом. Немного кривовато, конечно, но на безрыбье сойдет вполне. Еще раз спасибо за информацию.

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