首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在注释该线程的pthread_join时多次执行相同的线程子例程

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

Stack Overflow用户
提问于 2012-04-26 03:06:50
回答 2查看 1.5K关注 0票数 7

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

代码语言:javascript
运行
复制
    Thread2
    Thread1
    Thread1

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

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

代码语言:javascript
运行
复制
    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);
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-26 10:31:14

如果我得到这些结果,首先我将执行以下操作:

1)而不是下面的行,

代码语言:javascript
运行
复制
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); 

将其替换为,

代码语言:javascript
运行
复制
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 ");这是退出线程函数的正确方法。在函数结束时执行此操作。

代码语言:javascript
运行
复制
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编译程序的

这不是最终的解决方案。如果运行正常,那么我们可以继续下一步,同时启动两个线程。

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

票数 1
EN

Stack Overflow用户

发布于 2012-04-26 10:05:05

可能输出缓冲区未正确刷新。在执行多线程并将输出通过管道传输到文件时,我遇到过一个非常类似的问题--有时输出会出现两次。尝试将这一行添加到main函数中:

代码语言:javascript
运行
复制
setvbuf(stdout, NULL, _IONBF, 0);

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10322175

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档