2016-11-08 105 views
1

因为我从操作系统类中玩了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); 
} 
+1

看起来你的教程是错误的。消息可以按任何顺序出现,甚至可以穿插。 –

+1

新线程可能(但不总是)在pthread_create()返回之前开始运行。 因此,在每个线程启动之前或之后,您可能会在main()中返回控制权。这种不可预测性意味着显示语句可能以与教材答案不同的顺序出现。 –

+0

发布的代码不干净地编译!编译时,始终启用所有警告,然后修复这些警告。 ('gcc',最低限度使用:'-Wall -Wextra -pedantic'我也使用:'-Wconversion -std = gnu99')1)'main()'函数只有两个有效签名:'' int main(void)'和'int main(int argc,char * argv [])'注意,两者的返回类型都是'int' 2)'main()'函数缺少最后的右括号'}' 3)函数:'print_message_function()'返回类型为'void *',但缺少实际的'return'语句。 – user3629249

回答

1

这就是所谓的竞争状态。

它可能有可能,在thread1创建后,调度程序先调度thread1函数1,然后有可能线程函数先执行然后你的main()打印出来。

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

[email protected]:~$ ./a.out 
pthread_create() for thread 1 returns: 0 
pthread_create() for thread 2 returns: 0 
Thread 2 
Thread 1 
[email protected]:~$ ./a.out 
pthread_create() for thread 1 returns: 0 
pthread_create() for thread 2 returns: 0 
Thread 1 
Thread 2 
1

仔细看看教程。在我看来有一个错误:代码和它的结果不匹配(代码是关于返回代码pthread_create和打印输出是关于线程返回代码,这是不可访问的,因为调用pthread_join完成与NULL作为第二个参数以及print_message_function没有返回任何东西明智的)

尝试睡眠(0);如果(iret2)的乐趣...

1

执行的顺序取决于OS调度algorithm.Hence,任何一个无论是螺纹的或功能创建线程能够获得计划(取决于OS调度算法中)前。