我在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机器有关。
答案 0 :(得分:1)
没有错误。
你的程序在其他线程有机会输出任何内容之前退出,退出程序会杀死所有线程。
如果您希望所有主题都能正常完成,则需要pthread_join
所有主题。
答案 1 :(得分:0)
实际上,真正的问题是你的程序在主要结束时结束。在从main返回之前,你应pthread_join
给他们。其他线程在主要退出之前没有机会运行,将整个进程空间(以及未运行的线程)与它一起运行。
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);
}
以下是我原来的答案,仍然是一个很好的建议:
不要过多的空虚*。传递它的地址。如果需要,每次通过循环复制它以传入并稍后释放它。
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);
}
}