C에서 malloc()
호출에 대한 개념을 조금 더 명확하게하고 싶습니다. 주 스레드가 임의의 수의 작업자 스레드 (pthread)를 생성하는 다중 스레드 응용 프로그램이 있습니다. 그런 다음 각 작업자 스레드는 무한 기능을 실행합니다 (포함 된 기능은 다른 .c
파일에서 수행되며 while (1)을 구현합니다).이 스레드는 연속적인 네트워크 I/O를 담당합니다.다중 스레드로 메모리를 할당하는 중 세그먼트 오류가 발생했습니다
각 스레드에 대해 해시 테이블이 필요하므로 glib에서 제공하는 해시 맵을 사용했습니다. 내가 한 것은 백엔드에서 구조체에 대한 초기 메모리를 할당하고 필요에 따라 확장 할 수있는 각 스레드의 함수 내에 해시 맵을 초기화한다는 것입니다.
이제 애플리케이션을 실행했을 때 세그먼트 오류를 포함하여 오류가 발생했고 구조에 메모리를 할당 할 수 없었습니다. 오류가 해시 맵에 메모리를 할당 할 수 없기 때문에 발생했다는 것을 알기까지 어느 정도 시간이 걸렸습니다. 내가 생각한 (여전히 생각) 각 스레드는 자체 메모리 공간을 가지고 있으며, 자체 메모리 블록 내부에 해당 해시 맵에 대한 메모리 블록을 할당합니다.
lock mutex
initialize hashmap
unlock mutex
각 스레드에서 호출되는 해시 맵을 초기화하는 코드는 다음과 같습니다 :
나는 해시 맵과 같은 (sudo를 코드)의 초기화 전후mutex
잠금을 사용하여 오류를 수정할 수 있었다
GHashTable *g_hash_table;
g_hash_table = g_hash_table_new (g_int_hash, g_int_equal);
그러나 문제는 해결되었지만 이후에는 조금 혼란 스럽습니다. 각 스레드가 구현하는 함수에 대해 자체 메모리 공간을 가지고 있고 자체 스레드의 메모리를 할당하는 동안 다른 스레드와 충돌해서는 안되기 때문에이 문제는 잠금을 사용하지 않고 발생합니다. 모든 안내가 많이 감사합니다.
감사합니다.
참으로 스레드 자체 메모리가 의미하는 바는 자체 스택을 의미하며 스레드 내부에서 초기화되는 모든 구조는 해당 스택의 메모리에 할당되어야합니다. Thread-safe 한 Glib은 확실히 흥미로운 것입니다. 나는 그것에 대해 확신하지 못한다. 내 개념을 지울 수있는 도움을 원합니다 :) – Abdullah
해시 맵의 초기화 코드를 질문에 추가했습니다. – Abdullah
괜찮습니다. 그러나 'g_hash_table_new'팩토리 함수를 호출하고 거기에서 무슨 일이 일어나고 있는지 알 수 없습니다. –