自从我在操作系统课程中使用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);
}
答案 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)
执行顺序取决于操作系统调度算法。因此,线程或函数创建线程中的任何一个都可以进行调度(取决于操作系统调度算法)。