pthread_detach ничего не меняет

Я понимаю pthread_detach(pid), что: "хранилище для потока потока может быть восстановлено, когда этот поток завершается" (согласно http://pubs.opengroup.org/onlinepubs/7908799/xsh/pthread_detach.html) Однако я понимаю, что означает, что как только поток pid завершит работу, его память будет освобождена, и мы не сможем запустить его снова или вызвать на нем соединение. Тем не менее, я попробовал следующий код:

#include <stdio.h>
#include <pthread.h>

void* myFunction (void* arg)
{
  printf("Hello World from thread!\n");

}

int main()
{
pthread_t tid;
pthread_create(&tid, NULL, myFunction, NULL);
//pthread_join(tid, NULL);

int isDetached = -10;
isDetached = pthread_detach(tid);
printf("Is my thread detached: %d\n", isDetached);

int i;
for (i = 0; i<15; i++)
    printf("%d\n", i);

pthread_create(&tid, NULL, myFunction, NULL);
pthread_join(tid, NULL);

for (i = 0; i<15; i++)
    printf("%d\n", i);

return 0;

}

И я получаю следующее: результат

Если я правильно понимаю, так как я сделал pthread_detach(tid), я не должен быть в состоянии сделать

pthread_create(&tid, NULL, myFunction, NULL);
pthread_join(tid, NULL);

после этого, пока я сделал, и это работает отлично. Итак, какова цель создания othread_detach(pid), если мы все еще можем запустить поток и присоединиться к нему?

Большое спасибо!

3 ответа

pthread_t tid;
pthread_create(&tid, NULL, myFunction, NULL);

Это создает новый поток и последующий вызовpthread_detach(pid) отсоединяет созданную тему. Сейчас

pthread_create(&tid, NULL, myFunction, NULL);

Это создает новый поток, и впоследствии вы вызвали соединение, которое в основном ожидает завершения вновь созданного потока, а не того, который был отсоединен.

Вы можете проверить код, прикрепленный ниже. Когда вы запускаете этот код, отсоединенная нить печатает даже после вызова join, т.е. myfunc1 все еще печатает после pthread_join,

#include <stdio.h>
#include <pthread.h>

void *myFunction2 (void *arg)
{
    printf("Hello World from func2!\n");

}

void *myFunction1 (void *arg) 
{
    while(1) {
        printf("Hello World from func1\n");
    }
}

int main()
{
    pthread_t tid;
    pthread_create(&tid, NULL, myFunction1, NULL);
    //pthread_join(tid, NULL);

    int isDetached = -10;
    isDetached = pthread_detach(tid);
    printf("Is my thread detached: %d\n", isDetached);

    int i;

    pthread_create(&tid, NULL, myFunction2, NULL);
    pthread_join(tid, NULL);

    for (i = 0; i<15; i++)
        printf("%d\n", i);

    return 0;
}

pthread_detach просто говорит вашей программе, что текущий экземпляр tid не присоединюсь, (pthread_join) и освобождает любые ручки и объекты tid пример.

Так как ты звонил pthread_detach если вы попытаетесь pthread_join та нить не будет, так как была выпущена и утилизирована.

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

#include <stdio.h>
#include <pthread.h>

void * myFunction (void *arg)
{
  printf ("Hello World from thread!\n");

}

int main ()
{
  pthread_t tid;
  pthread_create (&tid, NULL, myFunction, NULL);
  //pthread_join(tid, NULL);

  int isDetached = -10;
  isDetached = pthread_detach (tid);
  printf ("Is my thread detached: %d\n", isDetached);

  /* ADDED FOR STACK OVERFLOW */
  pthread_join (tid, NULL);

  int i;
  for (i = 0; i < 15; i++)
    printf ("%d\n", i);

  pthread_create (&tid, NULL, myFunction, NULL);
  pthread_join (tid, NULL);

  for (i = 0; i < 15; i++)
    printf ("%d\n", i);

  return 0;
}

Я не уверен, что путаница, но если вы ожидали другого поведения, когда вы звонили pthread_create второй раз; обратите внимание, это действительно создает свежий экземпляр tid для тебя. Поэтому ваш второй вызов присоединения запускает поток.

Ваша переменная, tidэто не нить. Ваша программа не запускает один поток два раза, она создает два совершенно разных потока.

Фактические потоки - это объекты, которые существуют в операционной системе. Ваш tid Переменная - это просто "дескриптор", который вы можете использовать для взаимодействия с потоком. Ваш второй звонок pthread_create(&tid,...) повторно использует переменную handle, указывая ее на новый, другой поток.

Другие вопросы по тегам