POSIX pthread_join 在数千个线程后挂起
POSIX pthread_join hangs after thousands of threads
我是 POSIX 的新手,我找不到解决这个特定问题的方法。
在具有大量迭代(>100000)的循环内创建 pthread 是否存在任何已知问题?
好像每次执行都随机挂起[=13=].
- 我已经使用 valgrind 测试了内存泄漏和线程堆栈使用情况。
- 如果我在程序挂起时中断 gdb,它将跟踪问题到
pthread_join
。
这是重现我的问题的示例代码。
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
void* task(void* args);
int main(int argc, char **argv)
{
int num_threads = 4;
int m = 100000;
int i;
for(i = 0; i < m; i++)
{
fprintf(stdout, "i:%d\n",i);
//parallel region starts
pthread_t threads[num_threads];
int t,rc;
for(t = 0; t < num_threads; t++)
{
rc = pthread_create(&threads[t],NULL,task,NULL);
if(rc){
fprintf(stderr,"ERROR; return code from pthread_create() is %d\n", rc);
exit(-1);
}
}
for(t = 0; t < num_threads; t++)
{
rc = pthread_join(threads[t],NULL);
if(rc){
fprintf(stderr,"ERROR; return code from pthread_join() is %d\n", rc);
exit(-1);
}
}
//parallel region ends
}
pthread_exit(NULL);
}
//thread task
void* task(void* args)
{
pthread_exit(NULL);
}
已在 Ubuntu 机器 i7-4600U CPU @ 2.10GHz 上验证您的代码
我没有发现你的代码有任何问题,只是为了验证我编译了并且 运行 你的代码在我的本地机器上似乎工作正常。
我得到了预期的输出:
i:999,j:999
所以我假设您遇到的问题与您的环境有关。您使用的 CPU OS 和 GCC 是什么?
我是 POSIX 的新手,我找不到解决这个特定问题的方法。
在具有大量迭代(>100000)的循环内创建 pthread 是否存在任何已知问题?
好像每次执行都随机挂起[=13=].
- 我已经使用 valgrind 测试了内存泄漏和线程堆栈使用情况。
- 如果我在程序挂起时中断 gdb,它将跟踪问题到
pthread_join
。
这是重现我的问题的示例代码。
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
void* task(void* args);
int main(int argc, char **argv)
{
int num_threads = 4;
int m = 100000;
int i;
for(i = 0; i < m; i++)
{
fprintf(stdout, "i:%d\n",i);
//parallel region starts
pthread_t threads[num_threads];
int t,rc;
for(t = 0; t < num_threads; t++)
{
rc = pthread_create(&threads[t],NULL,task,NULL);
if(rc){
fprintf(stderr,"ERROR; return code from pthread_create() is %d\n", rc);
exit(-1);
}
}
for(t = 0; t < num_threads; t++)
{
rc = pthread_join(threads[t],NULL);
if(rc){
fprintf(stderr,"ERROR; return code from pthread_join() is %d\n", rc);
exit(-1);
}
}
//parallel region ends
}
pthread_exit(NULL);
}
//thread task
void* task(void* args)
{
pthread_exit(NULL);
}
已在 Ubuntu 机器 i7-4600U CPU @ 2.10GHz 上验证您的代码 我没有发现你的代码有任何问题,只是为了验证我编译了并且 运行 你的代码在我的本地机器上似乎工作正常。
我得到了预期的输出:
i:999,j:999
所以我假设您遇到的问题与您的环境有关。您使用的 CPU OS 和 GCC 是什么?