2014-09-21 43 views
0

我写了一个代码来做一些多线程来测试我的dd的写/读速度。同一线程ID的

一切正在编译和运行良好,但我注意到线程ID是相同的。

因此,我创建了一个条件(请参阅代码注释),它令人惊讶地表明我创建的每个线程都具有相同的ID。

int main(int argc, char *argv[]) { 
    //long filesize = 10000000; 
    int nb_threads = atoi(argv[2]); 
    pthread_t tid[4]; 
    int ok; 
    double latency; 
    double bandwith; 
    int err; 
    int i = 0; 
    srand(time(NULL)); 
    while(i < nb_threads){ 
     pthread_create(&(tid[i]),NULL,launch_dd_bm,(void *) argv); 
     pthread_join(tid[i], NULL); 
     /* if(!pthread_equal(tid[i],tid[i-1])){ 
       printf("Thread ID: %u",tid[i]); 
       i++; 
      } 
     */ 
     i++; 
    } 
    return EXIT_SUCCESS; 
} 

void *launch_dd_bm(void *arg); 

我知道我不测试线程是否成功创建,但他们是。 我刚刚删除了上述代码中的条件,以便您可以真正了解发生了什么。

回答

2

你调用pthread_join()立即创建线程之后,所以会发生什么是
主线程暂停并等待创建的线程来完成其
执行的执行。当第一个线程完成时,其Id不再使用,因此可以通过之后创建的线程“获取”相同的ID。这就是为什么所有
你的线程都有相同的ID。
为了避免这个问题,你应该在while循环之外调用pthread_join()。

2

pthread_create存储“创建的线程的ID”。因此线程ID只能保证在当前正在运行的线程中唯一,而不是在进程中创建的所有线程中。一旦线程退出,其ID可以安全地重用。这与malloc返回新指针类似,只要你不释放它们,在这一点上你可以重用那些指针。

如果你需要一个真正的永久ID,很容易实现一个共享计数器,例如,通过增加一个全局变量从launch_dd_bm(并记住用互斥体保护它)。

+0

但我的线程应该都是平行运行,那么为什么不是这样呢? 为了测试我的dd,我需要在多线程的同时写入或读取。 – 2014-09-21 18:19:58

+4

@JahMyst如果你想让你的线程并行运行,不要在'pthread_create()'后面的循环中调用'pthread_join()'。 – user4815162342 2014-09-21 18:22:26

+2

事实上,你应该有一个*独立的循环*在每个线程之后调用'pthread_join'来创建全部循环。在同一个循环中执行这两个操作,完全序列化该程序,就好像您刚刚在主线程中反复调用'launch_dd_bm(argv)'一样。 – 2014-09-21 18:43:08