我的循环在多线程中无法正常运行

时间:2016-10-09 15:23:43

标签: c multithreading pthreads pthread-join

我尝试编写一个多线程程序,并遇到一些问题。

运行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?

感谢您抽出时间阅读我的问题。

1 个答案:

答案 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中进行投射而不仅仅是隐藏通过使编译器静默来编程错误。