我尝试编写一个多线程程序,并遇到一些问题。
运行request.remoteip
后,我得到了
我:0
新线程0
新主题1
我:1 我:1
main.c
我的问题是
//main.c
#include <pthread.h>
#include <stdio.h>
#include <stdint.h>
void* routine(void* arg)
{
int id = (intptr_t) arg;
printf("new thread %d\n", id);
pthread_exit((void*)(intptr_t) id);
}
int main()
{
pthread_t t[2];
int i;
for(i=0; i<2; i++)
{
int ret = pthread_create (&t[i], NULL, &routine, (void *)(intptr_t) i);
if(ret != 0) {
printf("Error: pthread_create() failed\n");
return -1;
}
}
int id;
/////////here
for(i=0; i<2; i++)
{
printf("i: %d\n",i);
pthread_join(t[i], (void **)&id);
}
/////////here
pthread_exit(NULL);
}
更改为pthread_t t[2]
并创建两次,是否可以两次调用pthread_join?感谢您抽出时间阅读我的问题。
答案 0 :(得分:2)
首先添加一些debug-logging:
int id;
for(i=0; i<2; i++)
{
printf("i: %d\n",i);
pthread_join(t[i], (void **)&id);
printf("id[%d]: %d\n", i, id);
}
重新运行并记住输出。
然后将其改为看起来像这样
int id;
for(i=0; i<2; i++)
{
void * pv;
printf("i: %d\n",i);
pthread_join(t[i], &pv); /* Add error checking here! */
id = (intptr_t) pv;
printf("id: %d\n", id);
}
重新运行并与之前的版本进行比较。
根据经验:
如果面对看似需要使用C(而不是C ++)进行投射,请务必三思而后行,因为只有非常非常非常罕见的情况需要在C中进行投射而不仅仅是隐藏通过使编译器静默来编程错误。