я прочитал книгу, которая даст следующий код:Posix/Thread с присоединиться
void *printme(void *id) {
int *i;
i = (int *)id;
printf("Hi. I'm thread %d\n", *i);
return NULL;
}
void main() {
int i, vals[4];
pthread_t tids[4];
void *retval;
for (i = 0; i < 4; i++) {
vals[i] = i;
pthread_create(tids+i, NULL, printme, vals+i);
}
for (i = 0; i < 4; i++) {
printf("Trying to join with tid%d\n", i);
pthread_join(tids[i], &retval);
printf("Joined with tid%d\n", i);
}
}
и следующий возможный вывод:
Trying to join with tid0
Hi. I'm thread 0
Hi. I'm thread 1
Hi. I'm thread 2
Hi. I'm thread 3
Joined with tid0
Trying to join with tid1
Joined with tid1
Trying to join with tid2
Joined with tid2
Trying to join with tid3
Joined with tid3
И я не понимаю, как это возможно. Начнем с основного потока и создадим 4 потока: tids[0]... tids[3]
. Затем мы приостанавливаем выполнение (по команде объединения): основной поток будет ждать, что tids[0]
остановит выполнение, tids[0]
будет ждать до tids[1]
и так далее.
Так вывод должен быть:
Hi. I'm thread 0
Hi. I'm thread 1
Hi. I'm thread 2
Hi. I'm thread 3
Trying to join with tid0
Trying to join with tid1
Joined with tid0
Trying to join with tid2
Joined with tid1
Trying to join with tid3
Joined with tid2
Joined with tid3
Я чувствую, что я не понимаю, что-то на самом деле основной. Благодарю.
В потоках есть другое пространство выполнения, они просто выполняют функцию, и они не ожидали достижения второго цикла, их выполнение будет только printme. Они не гарантированы для работы в любом порядке, поэтому в этом случае все потоки создаются, а управление все еще находится в основном потоке. Когда соединение вызывается, оно переходит в режим сна, и любой произвольный поток работает. Он возвращает и освобождает соединение на себе. – Mustafa