다중 스레드 C 프로그램에서 GLib (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_ * 기능에 약간의 충돌이 같은 몇 가지 메시지를 보여줍니다. 단일 스레드 프로그램에서는 이러한 문제를 본 적이 없습니다.
GList는 본질적으로 스레드로부터 안전합니까? 그렇지 않다면, 내가 뭘해야합니까?
저는 POSIX 스레드 (pthread_create 등)를 사용했습니다. 자식 스레드를 생성하기 전에 부모 스레드에서 인수로 NULL을 g_thread_init() 사용해야합니까? –
아니요, g_thread 계열 함수를 사용해야합니다. 반면에 POSIX 스타일 스레드가 사용되면'G_THREADS_IMPL_POSIX'가 정의됩니다. –
계속 : "GLib은 완전히 스레드 안전합니다 (모든 글로벌 데이터는 자동으로 잠김). 그러나 개별 데이터 구조 인스턴스는 성능상의 이유로 자동으로 잠기지 않습니다. 예를 들어 다중 스레드에서 동일한 GHashTable에 대한 액세스를 조정해야합니다.이 규칙의 두 가지 주목할만한 예외는 스레드가 안전하며 더 이상의 응용 프로그램 수준 잠금이 필요하지 않은 GMainLoop 및 GAsyncQueue입니다 여러 스레드에서 액세스 할 수 있습니다. " 스레드는 * 자신의 목록을 만들었지 만 여러 스레드에서 동시에 액세스합니까? – nemequ