在打印之前调用线程,然后在线程之前执行print

时间:2016-11-08 06:14:16

标签: c linux pthreads posix

自从我在操作系统课程中使用pthreads以来,已经过了一年左右的时间,而且我一直试图回过头去寻找乐趣。以下是我在online source中运行的简单线程练习的代码。我担心的是教程说输出应该是:

Thread 1
Thread 2
pthread_create() for thread 1 returns: 0
pthread_create() for thread 2 returns: 0

这对我有意义。但是我得到了

pthread_create() for thread 1 returns: 0
pthread_create() for thread 2 returns: 0
Thread 1
Thread 2

pthread1.c

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

void *print_message_function( void *ptr );

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

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

     if(iret1)
     {
         fprintf(stderr,"Error - pthread_create() return code: %d\n",iret1);
         exit(EXIT_FAILURE);
     }

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

     if(iret2)
     {
         fprintf(stderr,"Error - pthread_create() return code: %d\n",iret2);
         exit(EXIT_FAILURE);
     }

     printf("pthread_create() for thread 1 returns: %d\n",iret1);
     printf("pthread_create() for thread 2 returns: %d\n",iret2);


     pthread_join( thread1, NULL);
     pthread_join( thread2, NULL);

     exit(EXIT_SUCCESS);

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

3 个答案:

答案 0 :(得分:1)

这就是所谓的竞争条件。

有可能在创建thread1之后,调度程序首先调度thread1 function1然后可能先执行线程函数然后执行main()打印。

在我运行程序时在我的系统上。

jeegar@jeegarp:~$ ./a.out 
pthread_create() for thread 1 returns: 0
pthread_create() for thread 2 returns: 0
Thread 2 
Thread 1 
jeegar@jeegarp:~$ ./a.out 
pthread_create() for thread 1 returns: 0
pthread_create() for thread 2 returns: 0
Thread 1 
Thread 2 

答案 1 :(得分:1)

仔细查看教程。在我看来有一个错误:代码和它的结果不匹配(代码是关于来自 pthread_create 的返回代码,打印出的是关于线程返回代码,因为调用 pthread_join 使用 NULL 作为第二个参数以及 print_message_function 缺少返回任何合理的内容)

if(iret2)之前尝试 sleep(0); 以获得乐趣......

答案 2 :(得分:1)

执行顺序取决于操作系统调度算法。因此,线程或函数创建线程中的任何一个都可以进行调度(取决于操作系统调度算法)。