2013-05-06 4 views
1

Я пытаюсь выяснить, использование pthread_exit, используя этот пример кода:Зачем использовать pthread_exit?

void* PrintVar(void* arg) 
{ 
    int * a = (int *) arg; // we can access memory of a!!! 
    printf("%d\n", *a); 
} 

int main(int argc, char*argv[]) 
{ 
    int a, rc; 
    a = 10; 
    pthread_t thr; 
    pthread_create(&thr, NULL, PrintVar, &a); 

    //why do I need it here?// 
    pthread_exit(&rc); /* process continues until last 
           threads termintates */ 

есть две вещи, которые я не совсем уверен:

  1. , когда мы используем pthread_create - Я передаю адрес параметра «a», , но является ли этот параметр «сохраненным» в «arg» функции PrintVar? например, если я использовал: PrintVar(void *blabla), и хотел передать 2 параметра из основной функции: int a = 10, int b= 20 .. как я могу это сделать?

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

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

+0

Ссылаясь на второй вопрос: Вы пробовали, что произойдет? Подсказки: добавьте 'sleep (1);' в начало 'PrintVar()' и закомментируйте вызов 'pthread_exit()'. – alk

+1

это основные вопросы для многопоточности, а также довольно интеллектуальный вопрос. https://computing.llnl.gov/tutorials/pthreads/, возможно, хорошая книга поможет больше – abasu

+0

@alk Я использовал его без сна, и он работал так же, как и без каких-либо потоков. Вот почему я смущен :(Я попробую, что вы предложили! Спасибо – user1386966

ответ

4
  1. когда мы используем pthread_create - я передаю «а» адрес параметра, но это время параметра Я «спасен» под «арг» в PrintVar функции?

«Оригинальный» a (которая определена в main) не копируются, вы только огибают указатель на него.

например, если я использовал: PrintVar (void * blabla) и хотел передать 2 параметра из основной функции: int a = 10, int b = 20 .. как я могу это сделать?

Положите эти два значения в struct и передать указатель на такую ​​структуру в качестве аргумента pthread_create (PrintVar, таким образом, получит такой указатель и будет иметь возможность получить два значения).

и мой второй вопрос - зачем нужен pthread_exit? это означает - дождаться завершения процесса - но какой сценарий я могу получить, если я не буду использовать эту строку?

pthread_exit завершает текущий поток, не прерывая процесс, если другие потоки все еще работают; возврат из main, вместо этого, эквивалентен вызову exit, который, насколько применимо к стандарту, должен «завершать программу» (таким образом, неявно убивая все потоки).

Теперь, будучи стандартным нитевым агентом C (до C11) и поддержкой для потоковой передачи в различных Unixes относительно недавнее добавление, в зависимости от libc/kernel/любая версия exit может или не может убивать только текущий поток или все потоки.

Тем не менее, в текущих версиях LIBC, exit (и, таким образом, вернуться из main) следует прекратить процесс (и, следовательно, все его нити), на самом деле, используя системный вызов exit_group на Linux.

Обратите внимание, что для Windows CRT применяется similar discussion.

+0

, так что если im с помощью exit() он завершит все потоки, но если i 'm, используя pthread_exit, он будет ожидать завершения того, какой из потоков завершится? Тот, который работает, означает, что ОС не может остановить поток «посередине»? – user1386966

+0

@ user1386966: если вы используете 'pthread_exit', он убьет только текущий поток, оставив остальных, процесс будет автоматически завершен, когда последний поток завершится. Используя 'exit', вы будете жестоко прекратить все потоки. Обратите внимание, что для« нормального »потока возврат из его точки входа эквивалентен с alling 'pthread_exit'; проблема заключается только в основном потоке, поскольку возврат из 'main' эквивалентен вызову' exit'. –

+2

+1 Я бы добавил, что довольно непростая практика передать адрес переменных автоматического хранения (стека) в подпрограммы запуска потока - этот стек может исчезнуть к тому моменту, когда новый поток просыпается, чтобы проверить его аргументы. – pilcrow

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