Как работает 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);

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