【问题标题】:Problem while compiling pthreads program编译 pthreads 程序时出现问题
【发布时间】:2010-12-15 18:02:57
【问题描述】:

我尝试用这个命令编译这个简单的 pthreads 程序

$ gcc -pthread -o pthreads pthreads.c
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

void *myThread(void *arg);

int main()
{
    pthread_t mythread;
    int ret;

    ret = pthread_create( &mythread, NULL, myThread, NULL );

    if (ret != 0){
        printf( "Can't create pthread: %s", strerror(errno));
        exit(-1);
    }
    return 0;
}

void *myThread(void *arg){

    // Thread code goes here..
    printf("OK! NOW ON THE THREAD\n");
    pthread_exit(NULL);
}

但是在尝试 ./pthreads 时没有输出!!

【问题讨论】:

    标签: c gcc pthreads


    【解决方案1】:

    您需要等待线程完成。否则,您可能会在线程开始执行之前退出。

    ... 
    pthread_create( &mythread, NULL, myThread, NULL );
    ...
    // Wait for the thread to finish.
    pthread_join( mythread, NULL);
    

    【讨论】:

      【解决方案2】:

      您没有等待线程完成。您需要使用 pthread_join()。

      【讨论】:

        【解决方案3】:

        你的问题来自于你的主线程是从主线程返回的,因此调用了exit(或_exit)。程序退出时,所有正在运行的线程都将被杀死。在这种情况下,工作线程在被杀死之前没有时间执行。

        您可以使用pthread_join 等待线程完成后再从main 返回。

        #include <stdio.h>
        #include <pthread.h>
        #include <stdlib.h>
        #include <string.h>
        #include <errno.h>
        
        void *myThread(void *arg);
        
        int main()
        {
            void* thread_return;
            pthread_t mythread;
            int ret;
        
            ret = pthread_create(&mythread, NULL, myThread, NULL);
            if (ret != 0)
            {
                printf("Can't create pthread: %s\n", strerror(errno));
                exit(-1);
            }
        
            ret = pthread_join(mythread, &thread_return);
            if (ret != 0)
            {
                printf("Can't join pthread: %s\n", strerror(errno));
                exit(-1);
            }
        
            return 0;
        }
        
        void *myThread(void *arg)
        {
            printf("OK! NOW ON THE THREAD\n");
            pthread_exit(NULL);
        }
        

        【讨论】:

          【解决方案4】:

          Sanjit 的回答当然是正确的,但是为了扩大你的线程工具箱,你也可以看看pthread_barrier_wait。当您有一个包含大量线程的简单程序并且main 看起来像“启动所有工作线程并等待它们完成”时,让 main 和所有工作人员简单地等待屏障可能是避免不得不存储所有工作线程 ID 并将它们加入一个 for 循环。障碍还有很多其他巧妙的用途,有时可以让您避免不必要的复杂性,因为它们使用互斥锁和条件变量做同样的事情。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-05-18
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多