在一個多線程C程序中,我使用了GLib的GList功能(https://developer.gnome.org/glib/2.35/glib-Doubly-Linked-Lists.html#g-list-append),其中多個線程創建了自己的列表。我觀察到不可預知的崩潰,有時一旦加載應用程序。堆棧跟蹤顯示glist_ *函數的一些崩潰的一些消息是這樣的:GList(glib-doubly-linked-list)線程安全嗎?
(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
或消息是這樣的:
MEMORY-ERROR: [25628]: GSlice: assertion failed: sys_page_size == 0 Aborted (core dumped)
(process:15426): GLib-ERROR (recursed) **: gmem.c:157: failed to allocate 137438953456 >bytes aborting... Aborted (core dumped)
我有理由相信,引進爲Glist使這一切的崩潰。在單線程程序中,我從來沒有見過這些問題。
GList本質上是線程安全的嗎?如果不是,我需要做什麼?
我不這樣做,我用POSIX線程(pthread_create等)。在產生子線程之前,我應該使用g_thread_init(),以NULL作爲參數,來自父線程嗎? –
不,您必須使用g_thread系列函數,另一方面如果使用POSIX樣式線程,則定義'G_THREADS_IMPL_POSIX' –
請繼續閱讀:「GLib完全是線程安全的(所有全局數據都會自動鎖定),但個別數據結構例如,你必須協調從多個線程訪問同一個GHashTable,這個規則的兩個值得注意的例外是GMainLoop和GAsyncQueue,它們是線程安全的,不需要進一步的應用程序級鎖定從多個線程訪問「。你說線程*創建了自己的列表,但它們是從多個線程併發訪問的嗎? – nemequ