2

我有这段代码:

#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#include <time.h>

int number;
pthread_mutex_t  *mutex;
pthread_t *threads;

void *PrintHello(void *threadid)
{
    long tid;
    tid = (long)threadid;
    printf("Hello World! It's me, thread #%ld!\n", tid);
    time_t rawtime;
    struct tm * time_start;
    time ( &rawtime );
    time_start = localtime ( &rawtime );
    printf ( "The number %ld thread is created at time %s  \n",tid, asctime     (time_start));
    pthread_exit(NULL);
}

int main(int argc, char *argv[])
{
    int i,rc;

    printf("give threads");
    scanf("%d",&number);
    mutex = calloc( number, sizeof(*mutex));
    threads = calloc(number, sizeof(*threads));

    for (i = 0; i < number;i++) {
        pthread_mutex_init( &mutex[i],NULL);
    }

    for(i=0; i<number; i++){
        printf("In main: creating thread %d\n", i);
        rc = pthread_create(&threads[i], NULL, PrintHello, (void *)i);
        if (rc){
            printf("ERROR; return code from pthread_create() is %d\n", rc);
            exit(-1);
        }
    }

    return 0;
}

此代码的目的是要求用户提供将要创建的线程数,在创建线程后,线程本身将打印 2 条消息,说明线程数和时间创建的。

问题是在主"In main: creating thread"线程内显示消息,但线程内的消息有时不显示。

例如,它将创建 3 个线程,只有 1 个线程会显示其消息,并且该线程也不会显示创建的时间。我不知道代码是否有问题。

4

2 回答 2

11

根本原因:
main()在子线程有机会完成任务之前退出。

解决方案:
您需要确保main()等待所有线程完成其工作。
你需要使用:

pthread_join()

来实现这个功能。在从返回之前添加以下内容main()

for(i=0; i<number; i++)
{
    pthread_join(threads[i], NULL);
}

其他问题:

  • 您动态分配内存,但从不释放它。尽管如此,一旦您的程序返回,操作系统就会回收内存。明确地这样做是一个好习惯。
  • 您创建了一个互斥锁,但您既没有使用它,也没有释放它。但这似乎是正在进行的代码。
于 2013-01-05T13:07:33.797 回答
3

Return frommain()相当于调用exit(...),它终止了整个过程。您可以使用pthread_join()等待每个非主线程,就像另一个答案建议的那样,或者您可以pthread_exit(NULL)在结束时调用main():它将退出初始线程,但其他线程将继续运行。

于 2013-01-05T13:11:37.780 回答