相同的线程 ID

Same thread ID's

本文关键字:ID 线程      更新时间:2023-10-16

我写了一段代码来进行一些多线程处理,以测试dd的写/读速度。

一切都在编译和运行,但我注意到线程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);

我知道我不是在测试线程是否成功创建,但它们确实成功了。我刚刚删除了上面代码中的条件,这样你就可以真正看到发生了什么。

创建线程后立即调用pthread_join(),因此会发生
主线程的执行将暂停并等待创建的线程完成其
处决当第一个线程完成时,它的Id不再使用,因此是相同的Id
"可以被随后创建的线程获取"。这就是为什么所有
您的线程具有相同的Id。
为了避免这个问题,您应该在while循环之外调用pthread_join()。

pthread_create存储"已创建线程的id"。因此,线程ID只保证在当前运行的线程中是唯一的,而不是在进程中创建的所有线程中。一旦线程退出,就可以安全地重用其ID。这类似于malloc在不释放新指针的情况下返回新指针的方式,此时释放的指针可能会被重用。

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