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, указывая ее на новый, другой поток.