Как проверить, завершается ли поток при использовании pthread? - PullRequest
1 голос
/ 19 ноября 2009

Как проверить, завершен ли поток? В моем случае у меня есть my_pthread [5], и я хочу проверить, завершил ли какой-либо из 5 потоков свою работу (завершен? - Я не уверен), тогда я могу дать им больше работы.

Если я использую pthread_join (), тогда оно должно быть:

pthread_join(my_pthread[0]);
...
pthread_join(my_pthread[4]);

Что если thread [3] завершит работу до thread [0], а затем мне придется ждать завершения thread0, 1, 2? Это не то, что я хочу.

Ответы [ 5 ]

2 голосов
/ 19 ноября 2009

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

Что бы я сделал, это

  • создать 5 рабочих очередей и 1 очередь результатов работы

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

Основной поток (отправка работы в 5 потоков) будет выглядеть примерно так:

for(;;) {
  struct threadmessage msg;
  struct *work_result;
  struct *work;
  thread_queue_get(&result_queue,NULL,&msg);
  work_result = msg->data;
  handle_result(work_result);
  work = get_more_work();
  thread_queue_add(worK_result->queue,work,0); 
  free_work_result(work_result);
}

Каждый из 5 рабочих потоков (обработка некоторой работы, отправка результата обратно в основной поток) будет выполнять:

for(;;) {
  struct threadmessage msg;
  struct *work_result;
  struct *work;
  thread_queue_get(my_queue,NULL,&msg);
  work = msg->data;
  process(work_result);
  work_result->queue = my_queue;
  thread_queue_add(&result_queue,work_result,0);
  free_work(work);
}

Код для реализации такой очереди находится здесь: http://asgaard.homelinux.org/svn/threadqueue/

1 голос
/ 19 ноября 2009
  1. Если они не отсоединены, вы можете подождать их, используя pthread_join: этот метод «ждет» завершения потока. Я не уверен, что ты этого хочешь.

  2. Если вы просто хотите назначить им какую-то другую работу (т.е. оставить их работающими), то используйте какой-либо канал связи, например потокобезопасная очередь. Другими словами, используйте очередь, чтобы сигнализировать о завершении задания и выдвигать новые задания через отдельную очередь.

Кроме того, посмотрите на этот поток на SO, когда дело доходит до отдельного потока.

0 голосов
/ 08 декабря 2009

Если я прав, вы хотите знать, какой из ваших 5 потоков завершает свою работу первым. Может быть, это хорошая идея использовать семафор для каждого из них, чтобы сообщить основному потоку, что они сделаны. Как это:

sem_t signal;

void *working_thread(void *p)
{
   // do somthing useful
  sem_post(&signal);

}

int main()
{
  // create 5 threads and semaphore
  sem_wait(&signal);
  return 0;
}
0 голосов
/ 19 ноября 2009

Прошло много времени с тех пор, как я работал с pthreads, но в целом с программированием потоков вы ожидаете завершения потока вызовом join (). После завершения вызова присоединения вы знаете, что поток завершил свою работу.

0 голосов
/ 19 ноября 2009

Я знаю, что если вы используете функцию wait () для родительской функции, то есть сигналы, которые установлены для дочерних потоков. Затем вы можете использовать некоторые макросы, определенные в wait.h, которые сообщат вам, каков статус завершенного потока. Кроме того, если поток завершен и вы используете команду exit (), любой заданный вами параметр отправляется обратно в родительский поток. Имейте в виду, это все в мире Си. Пробег других языков может отличаться.

...