gpt4 book ai didi

c - 为什么线程 id 不唯一?

转载 作者:行者123 更新时间:2023-11-30 20:36:24 24 4
gpt4 key购买 nike

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

在阅读了许多有关动态线程创建的问题和答案以及其他研究之后,我想出了以下代码。据我了解,要检查是否为每个文件创建了线程,我可以调用 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;
}

关于为什么线程不唯一有什么建议吗?我是多线程新手,尽管进行了大量研究,但我不明白我哪里出了问题。

最佳答案

你的代码几乎毫无意义:

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

第一点是您主要明确问题的答案。

不要使用syscall,直接调用gettid函数。

关于c - 为什么线程 id 不唯一?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36138824/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com