Как работает pthread_create()?
Учитывая следующее:
pthread_t thread;
pthread_create(&thread, NULL, function, NULL);
-
Что именно делает pthread_create
для thread
?
-
Что происходит с thread
после того, как он присоединился к основному потоку и завершился?
-
Что произойдет, если после того, как thread
присоединился, вы выполните следующее:
pthread_create(&thread, NULL, another_function, NULL);
Ответы
Ответ 1
Что именно делает pthread_create для потоковой передачи?
thread
- это объект, он может содержать значение для идентификации потока. Если pthread_create
преуспевает, он заполняет значение, которое идентифицирует вновь созданный поток. Если это не удается, тогда значение thread
после вызова undefined. (ссылка: http://pubs.opengroup.org/onlinepubs/009695399/functions/pthread_create.html)
Что происходит с потоком после того, как он присоединился к основному потоку и завершился?
Ничего не происходит с объектом, но значение, которое оно содержит, больше не относится к какому-либо потоку (так, например, вы больше не можете передавать его функциям, принимающим pthread_t
, и если вы случайно это сделаете, вы можете получить ESRCH
назад).
Что произойдет, если после присоединения потока вы выполните следующее:
То же, что и раньше: если pthread_create
преуспевает, присваивается значение, которое идентифицирует вновь созданный поток.
Ответ 2
pthread_create создаст поток, используя вызовы ОС. Замечательные вещи об абстракции - то, что вам действительно не нужно заботиться о том, что происходит внизу. Он установит переменную нить равной идентификатору, который можно использовать для ссылки на этот поток. Например, если у вас есть несколько потоков и вы хотите отменить один из них, просто вызовите
pthread_cancel (нить)
используя правильный идентификатор pthread_t, чтобы указать интересующий вас поток.
Что происходит с потоком после присоединения к основному потоку и прекращается?
Прежде чем поток завершится, поток var будет использоваться как ключ/индекс, чтобы получить или идентифицировать поток. После того, как поток завершает значение, которое указывает значение ключа/индекса, больше не должно быть действительным. Вы можете сохранить его и попытаться его повторно использовать, но это почти наверняка вызовет ошибки.
Что произойдет, если после присоединения потока вы выполните следующее:
pthread_create(&thread, NULL, another_function, NULL);
Нет проблем, так как вы даете ссылку на поток, значение потока будет установлено в качестве идентификатора для нового потока, который только что был создан. Я подозреваю, что он может быть таким же, как и раньше, но я не стал бы на него рассчитывать.