0

我在我的 Windows 7 机器中使用 MINGW 进行 POSIX 线程编码。

考虑以下简单代码:

#include <stdio.h>
#include <pthread.h>
#include <process.h>
#define NUM_THREADS 5

void *PrintHello(void *threadid)
{
    long tid;
        tid = (long)threadid;
    printf("Hello Dude...!!!\t I am thread no #%ld\n",tid);
    pthread_exit(NULL);
}
int main()
{
    pthread_t thread[NUM_THREADS];
    int rc;
    long t;
    for(t=0;t<NUM_THREADS;t++)
    {
        printf("Inside the Main Thread...\nSpawning Threads...\n");
        rc=pthread_create(&thread[t],NULL,PrintHello,(void*)t);
        if(rc)
        {
            printf("ERROR: Thread Spawning returned code %d\n",rc);
            exit(-1);
        }
    }
    return 0;
}

上面的程序在我的系统中执行时显示以下输出:

Inside the Main Thread...
Spawning Threads...
Inside the Main Thread...
Spawning Threads...
Hello Dude...!!!         I am thread no #0
Inside the Main Thread...
Spawning Threads...
Hello Dude...!!!         I am thread no #1
Inside the Main Thread...
Spawning Threads...
Hello Dude...!!!         I am thread no #2
Inside the Main Thread...
Spawning Threads...

这个程序应该产生 5 个线程。但它只创建了 2 个线程。前 2 行和最后 2 行表明即将调用 pthread_create() 例程。而且由于“rc”变量不是“1”,因此在线程创建中毫无疑问会出现任何错误,否则它会命中“if(rc)”部分。

那么错误在哪里?或者它与我的 Windows 机器有关。

4

2 回答 2

1

没有错误。

你的程序在其他线程有机会输出任何东西之前就退出了,退出你的程序会杀死它的所有线程。

pthread_join如果您希望所有线程都正确完成,您将需要所有线程。

于 2013-06-09T07:30:28.047 回答
0

实际上,真正的问题是你的程序在你的 main 结束时结束。pthread_join在从 main 返回之前,你应该去找他们。其他线程在 main 退出之前没有机会运行,占用了整个进程空间(以及您的未运行线程)。

for(t=0;t<NUM_THREADS;t++)
{
    printf("Inside the Main Thread...\nSpawning Threads...\n");
    rc=pthread_create(&thread[t],NULL,PrintHello,(void*)t);
    if(rc)
    {
        printf("ERROR: Thread Spawning returned code %d\n",rc);
        exit(-1);
    }
}

/* add this and you're golden! */
for(t=0; t<NUM_THREADS;t++) {
    pthread_join(thread[t], NULL);
}

以下是我的原始答案,仍然是很好的建议:

不要像 void* 一样长。传递它的地址。如果需要,每次通过循环复制它以传入并在以后释放它。

long thread_data[NUM_THREADS];
for(t=0;t<NUM_THREADS;t++)
    {
        thread_data[t] = t;
        printf("Inside the Main Thread...\nSpawning Threads...\n");
        rc=pthread_create(&thread[t],NULL,PrintHello,(void*)&(thread_data[t]));
        if(rc)
        {
            printf("ERROR: Thread Spawning returned code %d\n",rc);
            exit(-1);
        }
    }
于 2013-06-09T07:30:15.437 回答