2012-05-30 35 views
6

Как вы закрываете нить, когда закончите? как убедиться, что ничего больше не открывается или не запускается?Закройте нить, когда закончите с ней

до сих пор я знаю, как открыть его, но .. не как закрыть это правильно

int iret1; 
pthread_t thread1; 
char *message1; 

void *multithreading1(void *ptr) { 
    while (1) { 
     // Our function here 
    } 
} 

int main (int argc, char * const argv[]) { 
    if((iret1=pthread_create(&thread1, NULL, multithreading1, (void*) message1))) 
    { 
     printf("Thread creation failed: %d\n", iret1); 
    } 
    return 0; 
} 
+1

BTW в вашем примере, когда основной() достигает 'возвращение 0', вся ваша программа выходит (включая ваш PTHREAD). –

+0

Это правильно, просто убедитесь, что я использую меньше энергии – user1417815

ответ

7

«Как вы закрываете нить, когда закончите?»
Либо простое возвращение из этой функции, либо вызов pthread_exit function.

Обратите внимание, что вызов return также вызывает стек быть разматывают и переменные, объявленные в начальной процедуре должны быть уничтожены, таким образом, это более предпочтительно, чем pthread_exit функции:

An implicit call to pthread_exit() is made when a thread other than the thread in 
which main() was first invoked returns from the start routine that was used to 
create it. The function's return value shall serve as the thread's exit status. 

Для получения дополнительной информации и посмотреть на: return() versus pthread_exit() in pthread start functions

«убедившись, что ничего открыто больше или подножка»
Вместо того, чтобы убедиться wheth ваш поток все еще работает, вы должны дождаться его завершения, используя pthread_join function.

Вот пример:

void *routine(void *ptr) { 
    int* arg = (int*) ptr; // in C, explicit type cast is redundant 
    printf("changing %d to 7\n", *arg); 
    *arg = 7; 
    return ptr; 
} 

int main(int argc, char * const argv[]) { 
    pthread_t thread1; 
    int arg = 3; 
    pthread_create(&thread1, NULL, routine, (void*) &arg); 

    int* retval; 
    pthread_join(thread1, (void**) &retval); 
    printf("thread1 returned %d\n", *retval); 
    return 0; 
} 

выход

changing 3 to 7 
thread1 returned 7 
+0

Ничего себе, он потребляет много, гораздо меньше энергии и делает то, что мне нужно! спасибо LihO! : D – user1417815

+0

Я получаю «неверное преобразование из« void * »в« int * »из: int * arg = ptr ;, но объяснение льда! – user1417815

+2

@ user1417815: Отметьте мой ответ сейчас :) Вы получаете ошибку, потому что в C++ тип cast требуется в то время как в чистом C его можно опустить. – LihO

7

Чтобы сделать это, вы либо возврат из функции потока (multithreading1) или позвонить pthread_exit().

Для получения дополнительной информации см. POSIX Threads Programming.

+0

Так что-то вроде: pthread_exit (thread1)? или .. пожалуйста, покажите как – user1417815

+0

@ пользователь1417815, внутри ваш нить функция. человек pthread_exit. –

+0

@ Apprentice Queue вы могли бы показать пример? – user1417815

Смежные вопросы