为什么线程ID不是唯一的?

时间:2016-03-21 18:24:02

标签: c multithreading

我正在尝试为每个文件创建一个线程(以Linux为目标)。文件数基于当前目录中的文件数。因此,我试图创建一个动态数量的线程。

在阅读了许多有关动态线程创建和其他研究的SO问题和答案之后,我想出了以下代码。我的理解是,为了检查是否为每个文件创建了一个线程,我可以调用gettid()来返回调用者的线程ID,并且在多线程进程中,所有线程都具有相同的PID,但每个线程都有一个独特的TID。

但是,我打印的TID并不是唯一的,我不明白为什么。

char **filenames;
int file_cnt;
DIR *dir;


int main(int argc, char *argv[]) {

    int i;
    long tid;

    //atexit(cleanup);
    get_filenames();  //gets all files in the current directory

    printf("There are %d files:\n", file_cnt);
    pthread_t file[file_cnt];
    for(i = 0; i < file_cnt; i++) {
        printf("%s\n", filenames[i]);
        tid = syscall(SYS_gettid);
        pthread_create(&(file[i], NULL, get_filenames, (void *)file[i]);
        printf("%ld\n", tid);
    }
    return EXIT_SUCCESS;
}

有关为什么线程不唯一的任何建议?我是多线程的新手,尽管进行了大量的研究,我还是不明白我哪里出错了。

2 个答案:

答案 0 :(得分:0)

这一行

1. stuff 2. things 3. people 4. places
# => ["stuff", "things", "people", "places"] 

应该是

 printf("%ld\n", tid);

打印出新创建的线程的线程ID。

此外,您应该检查线程是否已创建

答案 1 :(得分:0)

您的代码几乎没有意义:

  1. gettid返回当前的线程ID,因此在您的示例中,创建进程时创建的线程的id。 for循环由该线程执行,而不是任何其他线程。 file[i]是循环中第i个创建线程的线程ID。
  2. 您创建了所有执行相同get_filenames函数的n个线程。我怀疑这个函数为你在循环之前已经计算过的所有n个线程返回相同的东西(我怀疑因为你没有给我们代码)。由于它可能访问相同的filenamesfile_cnt变量,因此您可能会在某个时间遇到严重的并发访问问题...
  3. 第一点是你的主要明确问题的答案。

    请勿使用syscall,直接调用gettid函数。