我在Solaris上运行了多线程C应用程序。在几个实例中,我得到的内存分配失败如下:
--- called from signal handler with signal 11 (SIGSEGV) ---
00130804 allocate__t24__default_alloc_template2b0i0Ui (20, 20, 30ab08, 1, 1, 0) + a4
0011e304 __nw__Q2t12basic_string3ZcZt18string_char_traits1ZcZt24__default_alloc_template2b
0i0_3RepUiUi (10, 10, 0, 0, 0, 0) + 14
0011e344 create__Q2t12basic_string3ZcZt18string_char_traits1ZcZt24__default_alloc_template
2b0i0_3RepUi (a, a, 0, 0, 0, 0) + 24
0011e708 replace__t12basic_string3ZcZt18string_char_traits1ZcZt24__default_alloc_template2
b0i0UiUiPCcUi (f9fff608, 0, ffffffff, f9fff6e0, a, 80808080) + 114
0013453c assign__t12basic_string3ZcZt18string_char_traits1ZcZt24__default_alloc_template2b
0i0PCcUi (f9fff608, f9fff6e0, a, 0, 0, 0) + 24
001332c4 assign__t12basic_string3ZcZt18string_char_traits1ZcZt24__default_alloc_template2b
0i0PCc (f9fff608, f9fff6e0, 0, 0, 9fe550, ff1b03d8) + 24
0012ffbc __t12basic_string3ZcZt18string_char_traits1ZcZt24__default_alloc_template2b0i0PCc
(f9fff608, f9fff6e0, ff1b554c, 1a, ff1b4fe8, ff1b5670) + 28
由于内存分配失败,我是否可以增加进程使用的堆区域?另外,我是否可以将alloc
使用的默认basic_string
函数替换为具有线程安全变体或自定义alloc
函数?
进一步信息:跨线程不共享字符串。每个线程处理其自己的数据集,该数据集具有动态增长的字符串向量,最终导致此alloc失败。当线程数增加时以及由于高容量数据导致矢量大小更多时,会出现问题。需要仔细混合堆栈和堆。需要有关如何增加默认堆和堆栈大小(任一)的信息。