Я полагаю, что ничто в спецификации не требует, чтобы pthread_create присвоил свой выходной параметр pthread_t *thread
до того, как код в start_routine
начнет выполняться.
Из практических соображений следующая программа успешно выполняется во многих реализациях pthreads(freebsd8 i386 и debian gnu / linux amd64), но не может найти интересующий меня (debian / kfreebsd9 amd64):
#include <pthread.h>
#include <assert.h>
#include <stdint.h>
#include <stdio.h>
pthread_t th;
void *asserter(void* unused) {
pthread_t self = pthread_self(), th_=th;
printf("th=%jd self=%jd\n", (intmax_t)th_, (intmax_t)self);
assert(pthread_equal(th_, self));
}
int main() {
int i;
for(i=0; i<1000; i++) {
pthread_create(&th, NULL, asserter, NULL);
pthread_join(th, NULL);
}
return 0;
}
, который сказал, я не уверен, что понимаю, как эта деталь поведения имеет отношениек двум вариантам кода, которые вы предлагаете в оригинальном вопросе.Хотя мне приходит в голову, что если pthread_create записывает другие значения в *thread
во время его выполнения, и вы используете значение *id
в другом потоке, это может быть актуально.Стандарт не устанавливает, что никакие другие «промежуточные» значения не записываются в *thread
во время успешного выполнения pthread_create.