2013-06-18 4 views
-1

В следующей программе, каковы возможности для упорядочения потоков? Предполагая, что «функция» будет печатать идентификатор потока, который является уникальным (поскольку здесь мы имеем только один процесс). Я всегда получаю заказ th1, th2!Порядок выполнения потоков в pthreads

#include <stdlib.h> 
#include <stdio.h> 
#include <pthread.h> 
int main() 
{ 
      pthread_t th1; 
      pthread_t th2; 
      pthread_create(&th1, NULL, function, NULL); 
      pthread_create(&th2, NULL, function, NULL); 
      pthread_join(th1, NULL); 
      pthread_join(th2, NULL); 
} 

    return 0; 
} 

ответ

2

Единственные заказные гарантии здесь, что pthread_join(th1, NULL); не вернется, пока поток 1 не вышел и pthread_join(th2, NULL); не вернется пока нить 2 не выйдет. Следовательно, функция main() не вернется (и процесс не будет завершен) до тех пор, пока не исчезнут ни поток 1, ни поток 2.

Накладной между нитью 1 и нитью 2 нет, их исполнение может быть произвольно перемежено.

+0

Спасибо @caf, так что вы имеете в виду «единственную» возможность th1, th2 ?! – Sara

+0

@sweet: Нет. Между нитью 1 и нитью 2 нет. – caf

2

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

Единственное упорядочение ограничение, можно предположить, что нить 2 будет предшествовать нить 1 из второго pthread_join

+0

Спасибо Tejas. Я ожидал этого, но я получил только один заказ, который является th1, th2, и мне интересно узнать причину! – Sara

+0

его из-за заявления pthread_join – tejas

+1

Никакой заказ. В большинстве случаев th1 будет делать это сначала, но нет никакой гарантии. – starmole

1

Это как фабрика. Получили двух рабочих. Нужно немного кофе, и поэтому начинается немного позже с той же задачей, что и другая (хорошо время для чайника). Затем этот рабочий стреляет по всем цилиндрам, но кофе вступает в силу. Нужно использовать loo. Итак, тот, который начался раньше, закончил сначала, но потратил больше времени на работу. Если бы у этого рабочего было ведро ?!

1

Начало сообщения os «начать делать это». Соединения говорят: «Подождите, пока это не будет сделано». Теперь вы говорите os «сделайте это» и «сделайте это». os может выбрать любой заказ. но большую часть времени он просто сделает это в том порядке, о котором вы ему сказали. это как заказать двух саммиев в метро. В 99% случаев вы получите их в том же порядке, о котором вы их просили. но каждая синяя луна нет. вы все еще ожидаете их обоих, прежде чем платить. :)

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