我正在尝试为每个文件创建一个线程(以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;
}
有关为什么线程不唯一的任何建议?我是多线程的新手,尽管进行了大量的研究,我还是不明白我哪里出错了。
答案 0 :(得分:0)
这一行
1. stuff 2. things 3. people 4. places
# => ["stuff", "things", "people", "places"]
应该是
printf("%ld\n", tid);
打印出新创建的线程的线程ID。
此外,您应该检查线程是否已创建
答案 1 :(得分:0)
您的代码几乎没有意义:
gettid
返回当前的线程ID,因此在您的示例中,创建进程时创建的线程的id。 for循环由该线程执行,而不是任何其他线程。 file[i]
是循环中第i个创建线程的线程ID。get_filenames
函数的n个线程。我怀疑这个函数为你在循环之前已经计算过的所有n个线程返回相同的东西(我怀疑因为你没有给我们代码)。由于它可能访问相同的filenames
和file_cnt
变量,因此您可能会在某个时间遇到严重的并发访问问题... 第一点是你的主要明确问题的答案。
请勿使用syscall
,直接调用gettid
函数。