Почему эти потоки не выполняются в том же порядке, что и код? - PullRequest
0 голосов
/ 13 апреля 2020

Я новичок в потоке в C и бездельничал, пытаясь узнать об этом. Я скомпилировал и выполнил приведенный ниже (очень простой c) код:

void *thread(void *vargp);

int main(int argc, char **argv) {
  pthread_t tid1, tid2;

  printf("Hello from the main thread.\n");

  printf("Creating thread 1.\n");
  pthread_create(&tid1, NULL, thread, NULL); 
  printf("Creating thread 2.\n");
  pthread_create(&tid2, NULL, thread, NULL);

  printf("Main thread is going to wait on peer threads.\n");
  pthread_join(tid1, NULL);
  pthread_join(tid2, NULL);
  printf("Peer threads have completed.\n");

  return EXIT_SUCCESS;
}

void *thread(void *vargp) {
  pthread_t tid = pthread_self();
  printf("Hello from thread %u.\n", (unsigned int)tid);
  return NULL;
}

Я ожидал, что результат будет ...

Hello from the main thread.
Creating thread 1.
Hello from thread [number].
Creating thread 2.
Hello from thread [number].
...

Но вместо этого это было:

Hello from the main thread.
Creating thread 1.
Creating thread 2.
Main thread is going to wait on peer threads.
Hello from thread 3067947840.
Hello from thread 3076340544.
...

Почему вывод был в таком порядке? Два потока ожидали, пока не запустится функция соединения, или они просто так долго занимали? Нужно ли присоединять потоки к основному потоку, чтобы распечатать вывод на консоль?

Спасибо, что объяснили это мне !!

1 Ответ

1 голос
/ 13 апреля 2020

У вас есть только созданные темы 1 и 2 по порядку. Но они обязательно выполняются в этом порядке. Порядок выполнения зависит от того, как они запланированы, количества доступных процессоров и т. Д. c. Таким образом, вы можете увидеть выходные данные двух потоков в любом порядке.

Если вы хотите получить выходные данные в «порядке», вы можете дождаться завершения первого потока, прежде чем начинать следующий.

  printf("Creating thread 1.\n");
  pthread_create(&tid1, NULL, thread, NULL); 
  pthread_join(tid1, NULL);
  printf("Creating thread 2.\n");
  pthread_create(&tid2, NULL, thread, NULL);
  pthread_join(tid2, NULL);

Это, конечно, отрицательно сказывается на цели многопоточности, поскольку только один поток когда-либо делает что-нибудь полезное.

Упорядочение может быть достигнуто многими способами. Простым способом может быть использование семафора .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...