在多线程 C 程序中,我使用了 GLib 的 GList 功能(https://developer.gnome.org/glib/2.35/glib-Doubly-Linked-Lists.html#g-list-append),其中多个线程创建了自己的列表。我观察到不可预知的崩溃,有时在应用程序加载时就发生了。堆栈跟踪显示 glist_* 函数中的一些崩溃,一些消息如下:
(gdb) bt
#0 0x00007fffeb54a964 in g_slice_alloc () from /lib64/libglib-2.0.so.0
#1 0x00007fffeb52aac6 in g_list_append () from /lib64/libglib-2.0.so.0
或这样的消息:
内存错误:[25628]:GSlice:断言失败:sys_page_size == 0 中止(核心转储)
(process:15426): GLib-ERROR (recursed) **: gmem.c:157: failed to allocate 137438953456 >bytes aborting... Aborted (core dumped)
我有理由相信 GList 的引入导致了所有这些崩溃。在单线程程序中,我从未见过这些问题。
GList 本质上是线程安全的吗?如果没有,我需要做什么?