pthread выполнение в linux - PullRequest
       13

pthread выполнение в linux

3 голосов
/ 14 февраля 2011

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

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

void *print_message_function( void *ptr );

int main(){
 pthread_t thread1, thread2;
 char *message1 = "Thread 1";
 char *message2 = "Thread 2";
 int  iret1, iret2;

/* Create independent threads each of which will execute function */

 iret1 = pthread_create( &thread1, NULL, print_message_function, (void*) message1);
 iret2 = pthread_create( &thread2, NULL, print_message_function, (void*) message2);

 /* Wait till threads are complete before main continues. Unless we  */
 /* wait we run the risk of executing an exit which will terminate   */
 /* the process and all threads before the threads have completed.   */

 pthread_join( thread1, NULL);
 printf("amit");
 pthread_join( thread2, NULL); 

 printf("Thread 1 returns: %d\n",iret1);
 printf("Thread 2 returns: %d\n",iret2);
 exit(0);
}

void *print_message_function( void *ptr ){
 char *message;
 message = (char *) ptr;
 printf("%s \n", message);
}

Первое, что я хотел бы знать, это то, что порядок выполнения потоков не является последовательным ??

Во-вторых, я намеренно положил print ("amit«);видеть, что main действительно останавливается во время завершения thread1, но в выводе мы видим, что сначала выполняется оператор printf.Вывод всего процесса:

Поток 1

Поток 2

amitThread 1 возвращает: 0

Возвращает поток 2: 0

Ответы [ 2 ]

12 голосов
/ 14 февраля 2011

Вы правы, говоря, что порядок выполнения потока не является последовательным . В некоторой степени в этом весь смысл использования потоков, то есть одновременного запуска других задач.

Результат, который вы видите, соответствует ожидаемому и может отличаться.

Возможно, это поможет:

   main            thread1     thread2
    |                
    |--create--------+-----------\
    |                |           |   
    |            "Thread 1"      |   "Thread 2" can
    |                |           |<- occur anywhere
    |               /            |   along this line
   join(1) ---------             |
    |                            |
    |                            |
  "amit"                         |
    |                            |
    |                            |
   join(2) ---------------------/
    |
    |
"Thread 1 returns"
"Thread 2 returns"
    |
  exit(0)

Единственная гарантия, которую вы имеете:

  • "Thread 1" всегда будет печататься перед "amit" (потому что pthread_join() ожидает завершения потока 1, прежде чем может продолжиться основная программа)
  • Операторы "Thread X returns ..." всегда будут заканчиваться после завершения обоих потоков.
2 голосов
/ 14 февраля 2011

Первое, что мне хотелось бы знать, это порядок выполнения потоков не последовательный?

Не нормально. Потоки в большинстве современных операционных систем (в ранних реализациях потоков в Linux использовалась совместная многозадачность) выполняются параллельно, и порядок выполнения ваших printf s является частично недетерминированным. pthread_join s накладывают некоторый порядок на вещи, поэтому:

  • Thread 1 должно предшествовать Amit, поскольку основной поток ожидает завершения потока 1, прежде чем печатать Amit1
  • Thread 2 должен предшествовать Thread 1 returns: из-за второго pthread_join. Все printf s в main отображаются в порядке их появления в main.

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

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