因为我从操作系统类中玩了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);
}
看起来你的教程是错误的。消息可以按任何顺序出现,甚至可以穿插。 –
新线程可能(但不总是)在pthread_create()返回之前开始运行。 因此,在每个线程启动之前或之后,您可能会在main()中返回控制权。这种不可预测性意味着显示语句可能以与教材答案不同的顺序出现。 –
发布的代码不干净地编译!编译时,始终启用所有警告,然后修复这些警告。 ('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