c - 在为该线程评论 pthread_join 时多次执行同一线程子例程

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

最佳答案

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

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

编译您的程序

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

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

关于c - 在为该线程评论 pthread_join 时多次执行同一线程子例程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10322175/

相关文章:

java - java线程是如何调度的?

java - Java同时访问同一个对象的不同成员

linux - pthreads 的 Nice-Level?

linux - Linux pthread 中 SetThreadIdealProcessor 的替换

c - 为什么我们需要指向 C 中成员运算符的指针

java - 奇怪的多线程行为

c - 在字符串上使用sscanf时,如何正确使用(否定的)字符类或扫描集?

php - 我如何在php多线程中使用静态方法

c++ - 广义超几何函数 pFq 的实现

c - 交叉编译时如何使用外部库?