Поток, который останавливает другой в C - PullRequest
2 голосов
/ 29 февраля 2012

У меня 2 темы. Моя цель состоит в том, чтобы первым, завершившим собственное выполнение, пришлось остановить другой поток. Возможно ли это?

У меня есть этот код:

#include <stdio.h>
#include <pthread.h>
#include <sys/types.h>

void* start1(void* arg)
{
  printf("I'm just born 1\n");
  int i = 0;
  for (i = 0;i < 100;i++)
  {
    printf("Thread 1\n");
  }
  printf("I'm dead 1\n");
  pthread_exit(0);
}

void* start2(void* arg)
{
  printf("I'm just born 2\n");
  int i = 0;
  for (i = 0;i < 1000;i++)
  {
    printf("Thread 2\n");
  }
  printf("I'm dead 2\n");
  pthread_exit(0);
}

void* function()
{
  int k = 0;
  int i = 0;
  for (i = 0;i < 50;i++)
  {
    k++;
    printf("I'm an useless function\n");
  }
}   

int main()
{
  pthread_t t, tt;
  int status;
  if (pthread_create(&t, NULL, start1, NULL) != 0)
  {
    printf("Error creating a new thread 1\n");
    exit(1);
  }
  if (pthread_create(&tt, NULL, start2, NULL) != 0)
  {
    printf("Error creating a new thread 2\n");
    exit(1);
  }
  function();
  pthread_join(t, NULL);
  pthread_join(tt, NULL);
  return 0;
}

Например, первый поток должен остановить второй. Как можно это сделать?

Ответы [ 4 ]

10 голосов
/ 29 февраля 2012

Обычно не рекомендуется принудительно завершать поток. Чистый способ завершить другой поток - установить флаг (видимый для обоих потоков), который указывает потоку завершить себя (путем немедленного возврата / выхода).

0 голосов
/ 29 февраля 2012

См. Метод pthread_cancel() для отмены (завершения) потока.

0 голосов
/ 29 февраля 2012

Передайте в качестве аргументов двум потокам идентификатор потока другого. Чем позвонить pthread_kill(other_thread_id, SIGKILL) в первый, который заканчивает свою работу. Я предполагаю, что вы знаете, что делаете (вас уже предупреждали, что это плохая практика).

0 голосов
/ 29 февраля 2012

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

Если вы должны использовать этот подход, я бы сделал первый поток порождающим второй, а затем второй трид (так что он «владеет» этим потоком).thread).

Наконец, если вы должны сделать это таким образом, вы можете передать поток первому рабочему с помощью аргумента void *.

Также вам не нужно явно выходить из потока, простопусть он «убежит», а затем присоединится к нему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...