在为该线程注释pthread_join时多次执行相同的线程子例程

时间:2012-04-25 19:06:50

标签: c multithreading pthreads

我是线程新手。 这里如果我评论pthread_join(thread1,NULL),那么在输出中有时我会得到

    Thread2
    Thread1
    Thread1

我无法理解为什么Thread1跟踪会出现两次以及pthread_join的确切功能是什么。

另外,请参考一些有关初学者的线程概念的教程。

    void *print_message_function( void *ptr );
    main()
    {
            pthread_t thread1, thread2;
            char *message1 = "Thread 1";
            char *message2 = "Thread 2";
            int  iret1, iret2;
            iret1 = pthread_create( &thread1, NULL, print_message_function, (void*) message1);
            iret2 = pthread_create( &thread2, NULL, print_message_function, (void*) message2);
            pthread_join( thread1, NULL);

            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);
    }

2 个答案:

答案 0 :(得分:1)

输出缓冲区可能没有正确刷新。我在执行多线程并将输出传递给文件时遇到了一个非常类似的问题 - 有时输出会出现两次。尝试将此行添加到主函数中:

setvbuf(stdout, NULL, _IONBF, 0);

这将强制在每次写入时刷新输出缓冲区。

答案 1 :(得分:1)

如果我得到这些结果,首先我会做以下事情:

1)而不是下面的行,

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

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

pthread_join( thread2, NULL); 

替换为,

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

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

pthread_join( thread2, NULL); 

看看结果是什么。

2)在你的线程函数中,你需要调用pthread_exit(“Exit”);这是退出线程函数的正确方法。在功能结束时这样做。

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

如果你这样做,理想情况下你不应该遇到任何问题。在每种情况下,我假设您正在使用gcc -D_REENTRANT -o threadex threadex.c -lpthread

编译您的程序

这不是最终解决方案。如果进展顺利,那么我们可以继续下一步一次启动两个线程。

请在合并这些更改后分享反馈意见。