- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个应用程序,它在主线程中使用 pthread_create()
和 pthread_detach()
,然后在子线程中使用 pthread_exit()
线程。
在大约 54 个 pthread_create()
调用之后,每个调用都与后续的 pthread_detach()
配对,然后是 pthread_exit()
pthread_create()
失败。这是 ENOMEM
失败“内存不足”。
什么可能导致 pthread_exit()
无法释放旧线程的内存并导致我的应用程序泄漏内存并最终耗尽?
这是在 Linux Centos 5 64 位上运行,但构建的是 32 位应用程序。
下面是创建线程的代码,它调用了 pthread_create()
和 pthread_detach()
。
int
_createThread()
{
pthread_attr_t attr;
int return_val;
return_val = setupMutex(_Mtx());
if (return_val != 0) {
return return_val;
}
return_val = setupCond(_StartCond());
if (return_val != 0) {
return return_val;
}
return_val = setupCond(_EndCond());
if (return_val != 0) {
return return_val;
}
return_val = pthread_attr_init(&attr);
if (return_val != 0) {
return -1;
}
size_t stackSize = 1024 * 1024 * 64; // Our default stack size 64MB.
return_val = pthread_attr_setstacksize(&attr, stackSize);
if (return_val != 0) {
return -1;
}
int tries = 0;
retry:
// _initialize() gets called by the thread once it is created.
return_val = pthread_create(&_threadId, &attr,
(void *(*)(void *))_initialize,
(void *)this);
if (return_val != 0) {
if (return_val == EAGAIN) {
if (++tries < 10) {
Exit::deferredWarning(Exit::eagainThread);
goto retry;
}
}
return -1;
}
return_val = pthread_attr_destroy(&attr);
if (return_val != 0) {
return -1;
}
return_val = pthread_detach(_threadId);
if (return_val != 0) {
return -1;
}
// Wait for the new thread to finish starting up.
return_val = waitOnCond(_Mtx(), _EndCond(), &_endCount, 10 /* timeout */, 0,
"_createThread-end");
if (return_val != 0) {
return -1;
}
return 0;
}
void
_exitThread()
{
(void) releaseCond(_Mtx(), _EndCond(), &_endCount, "_exitThread-end");
pthread_exit(NULL);
}
最佳答案
在 pthread_exit 之前调用 pthread_join 以便线程可以在退出前进行清理。
关于c++ - ENOMEM 创建线程失败的原因?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4530787/
我在我的 xcode 项目中使用“libarchive”,但出现以下错误 if (bytes_read block_size && ferror(mine->f)) { archive_set
我有一个应用程序,它在主线程中使用 pthread_create() 和 pthread_detach(),然后在子线程中使用 pthread_exit()线程。 在大约 54 个 pthread_c
读取带有错误 ENOMEM 返回的套接字时怎么会发生这种情况?Man 2 阅读,我看不到有关此错误的任何详细信息,有人可以帮助我。谢谢。我的 linux 内核 2.6.26-1-686。 最佳答案 环
我阅读了与该主题相关的所有帖子,但没有找到任何能够解决我的问题的内容。 我正在尝试映射一个由基础文件支持的 900Mb MAP_SHARED。我们有 2Gb 的 RAM 和只有 2Gb 的虚拟内存可用
我有一个 ruby 脚本,它在内存中加载大量数据,然后需要 shell out 来对这些数据执行任务。但有时,数据太大以至于脚本在交换区中运行,在这种情况下,shell out 会给我一个 Err
我正在尝试使用 ffmpeg 的 vaapi 库在 GPU 上执行 h264 视频编码。 我一直在关注这个example来自 ffmpeg Github 存储库。 它在这里对我来说失败了: AVBuf
Linux/Unix 定义了大量相对相似的错误代码。是否有任何普遍遵循的约定建议应将哪些类型的错误绑定(bind)到哪些错误代码? 假设我的函数有一些具有固定大小的任意容器(并且由于与实际 RAM 使
我发现 pthread_create() 在具有 4GB 实际内存的 64 位 RHEL 计算机上失败,并出现 rc=12 (ENOMEM)。当线程创建失败时,“top”命令显示进程正在使用 1G 虚
我有一台用 C++ 实现的服务器,运行在具有 25GB RAM 的 Windows 2003 企业版上。 在压力测试期间,我看到当它试图通过调用 _beginthread 创建一个新线程时,我得到了
我有一个在生产环境中运行的工作,它处理 xml 文件。xml 文件总计约 4k,大小为 8 到 9 GB。 处理后,我们得到 CSV 文件作为输出。我有一个 cat 命令,它将所有 CSV 文件合并到
我有一 block SH4 板,这是规范... uname -a Linux LINUX7109 2.6.23.17_stm23_A18B-HMP_7109-STSDK #1 PREEMPT Fri
以下程序在内存用完时被内核杀死。我想知道何时应该将全局变量分配给“ENOMEM”。 #define MEGABYTE 1024*1024 #define TRUE 1 int main(int arg
我正在使用 Monotouch 编写一个 iPhone 应用程序,最近该应用程序开始崩溃,并指出 Mprotect failed at 0x863a000 (length 8192) with err
我正在运行 pdfinfo 命令来获取有关大小为 100KB 的 pdf 的信息。相关代码为 const pdfInfo = execute(`pdfinfo '${input}' | gre
几个月来,我的生产 Node.js (v12) 应用程序一直出现 ENOMEM 错误。 这个问题特别难以诊断,因为我的堆总是在 100MB 范围内并且不会随着时间的推移而增加。因此不太可能发生 Nod
进程运行卡在 32000 (± 5%) 左右 ~# cat/proc/sys/kernel/threads-max127862 ~# ulimit -s堆栈大小(千字节,-s)2048 可用内存:3,
我有一个大部分情况下都可以运行的应用程序,但我有一种情况,其中对::popen() 的调用出现错误,errno 设置为 ENOMEM。::popen() 的手册页将您引向::fork() 的页面,该页
在 linux 中试验 shm_open 并遇到问题。我经常使用 ftrunc 调整共享内存段的大小,并使用 mmap 重新映射调整大小的段。然而,就在 20 兆字节左右,我从 mmap 获得了 EN
我的 Node.js 脚本在使用 spawn 时由于抛出 ENOMEM(内存不足)errnoException 而崩溃. 错误: child_process.js:935 throw errnoE
我正在尝试在 Fedora Linux x86_64(4G 内存加 16G 交换空间)下映射一个 1TB 的匿名文件。但是我得到了 ENOMEM“无法分配内存”,甚至是 32G,如下代码所示。我错过了
我是一名优秀的程序员,十分优秀!