gpt4 book ai didi

c - 即使使用正确,Pthreads 也会泄漏内存

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

我已经为此奋斗了很长时间。环顾四周,我似乎无法找到答案。我只是创建两个分离的线程,然后对它们都使用 pthread_exit() 但时不时地会出现泄漏。

因为我知道人们会问我:

  1. 是的,我已阅读所有其他问题,但没有真正的答案
  2. 我将线程标记为分离
  3. 我给了足够的时间让线程初始化和终止
  4. 我已阅读 pthread_exit 的手册并且正确使用
  5. 使用 -Wall 可以正常编译

代码:

int threads_keepalive = 1;

void* thread_do(void *arg){
while(threads_keepalive)
sleep(1);
pthread_exit(NULL);
}

int main(){

/* Make threads */
pthread_t* threads;
threads = malloc(2 * sizeof(pthread_t));
pthread_create(&threads[0], NULL, thread_do, NULL);
pthread_create(&threads[1], NULL, thread_do, NULL);
pthread_detach(threads[0]);
pthread_detach(threads[1]);
sleep(1); // MAKING SURE THREADS HAVE INITIALIZED

/* Kill threads */
threads_keepalive = 0;
sleep(5); // MAKING SURE THREADS HAVE UNBLOCKED
free(threads);

return 0;
}

运行该代码,尽管它是正确的(至少在我看来),但我会随机出现内存泄漏。我使用 valgrind 多次运行相同的测试,如下所示

> gcc test.c -pthread -o test && for i in {1..100}; do valgrind --leak-check=full --track-origins=yes ./test 2>&1 | grep frees; done
==4088== total heap usage: 8 allocs, 4 frees, 2,230 bytes allocated
==4211== total heap usage: 8 allocs, 4 frees, 2,230 bytes allocated
==4337== total heap usage: 8 allocs, 4 frees, 2,230 bytes allocated
==4463== total heap usage: 8 allocs, 4 frees, 2,230 bytes allocated
==4590== total heap usage: 8 allocs, 8 frees, 2,230 bytes allocated
==4717== total heap usage: 8 allocs, 8 frees, 2,230 bytes allocated
==4853== total heap usage: 8 allocs, 4 frees, 2,230 bytes allocated
==4981== total heap usage: 8 allocs, 8 frees, 2,230 bytes allocated
==5110== total heap usage: 8 allocs, 8 frees, 2,230 bytes allocated
==5239== total heap usage: 8 allocs, 8 frees, 2,230 bytes allocated
..

这是怎么回事?

更新:创建一个线程而不是两个线程,不会显示内存泄漏。

最佳答案

你的问题的标题是错误的——你没有正确使用线程。但我不认为你的内存泄漏与任何未定义行为的实例有关。这只是 valgrind 报告的一个虚假的“泄漏”,原因是(假设您使用的是带有 glibc 的 Linux 系统)glibc 内部结构。请参阅这些相关问题:

关于c - 即使使用正确,Pthreads 也会泄漏内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27803819/

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