gpt4 book ai didi

C pthread_join 段错误

转载 作者:太空宇宙 更新时间:2023-11-04 06:35:07 25 4
gpt4 key购买 nike

我正在尝试编写一个 C 程序,该程序使用线程来计算目录树的大小。

当只有一个子目录时,我的代码工作正常,但是每当我有 2 个或更多子目录时,我就会收到段错误。我阅读了很多有关它的内容,但无法找出我的代码失败的原因。

在我的全局范围内:

pthread_mutex_t mutex;
int total_size = 0; // Global, to accumulate the size

主要():

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

...

if (pthread_mutex_init(&mutex, NULL) < 0)
{
perror("pthread_mutex_init");
exit(1);
}

pthread_create(&thread, NULL, dirsize, (void*)dirpath);
pthread_join(thread, NULL);

printf("\nTotal size: %d\n\n", total_size);

...
}

我的dirsize() 函数:

void* dirsize(void* dir)
{
...

pthread_t tid[100];
int threads_created = 0;

dp=opendir(dir);
chdir(dir);

// Loop over files in directory
while ((entry = readdir(dp)) != NULL)
{
...

// Check if directory
if (S_ISDIR(statbuf.st_mode))
{
// Create new thread & call itself recursively
pthread_create(&tid[threads_created], NULL, dirsize, (void*)entry->d_name);
threads_created++;
}
else
{
// Add filesize
pthread_mutex_lock(&mutex);
total_size += statbuf.st_size;
pthread_mutex_unlock(&mutex);
}
}

for (i = 0; i < threads_created; i++)
{
pthread_join(tid[i], NULL);
}
}

我在这里做错了什么?如果您能指出正确的方向,我将不胜感激。

这是我通过 gdb 获得的信息:http://pastebin.com/TUkHspHH

提前致谢!

最佳答案

NUM_THREADS 的值是多少?

    // Check if directory
if (S_ISDIR(statbuf.st_mode))
{
// Create new thread & call itself recursively
pthread_create(&tid[threads_created], NULL, dirsize, (void*)entry->d_name);
threads_created++;
}

在这里你应该检查 threads_created 是否等于 NUM_THREADS 如果是的话增加 tid 数组的大小(我会 malloc 在函数开始处,free 在结尾处,顺便说一下)。

此外,在将目录名称作为参数传递给线程之前,您应该分配目录名称的副本 (malloc + strcpy),并在函数结束时释放此类副本,而不是 entry->d_name .

关于C pthread_join 段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15865197/

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