2012-04-21 2 views
1

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); 

그러나 문제는 해결되었지만 이후에는 조금 혼란 스럽습니다. 각 스레드가 구현하는 함수에 대해 자체 메모리 공간을 가지고 있고 자체 스레드의 메모리를 할당하는 동안 다른 스레드와 충돌해서는 안되기 때문에이 문제는 잠금을 사용하지 않고 발생합니다. 모든 안내가 많이 감사합니다.

감사합니다.

답변

2

각 스레드는 자체 메모리 공간을 갖지 않습니다. 모든 스레드는 프로세스 내의 모든 스레드 메모리에 액세스 할 수 있습니다.

말하자면, 각 스레드는이 공간에서 자체 스택을 할당받습니다. 따라서 auto-vars는 잘못 사용하지 않는 것이 좋으며 malloc/free는 스레드로부터 안전해야하므로 동적 할당 된 해시 맵 (스레드 스택의 자동 포인터)가 정상적으로 처리되어야합니다.

선택할 수있는 경우 라이브러리의 스레드 안전 버전과 연결되어 있는지 확인하십시오.

뮤텍스 잠금이 필요하지 않습니다. 그것이 문제를 해결한다면, 당신 말이 맞습니다. malloc/free는 thread-safe 일 필요가 없습니다.

해시 맵 코드는 자동 또는 malloced 스토리지 만 참조합니까? 전역 변수/통계 값이 들끓지 않았습니까?

+0

참으로 스레드 자체 메모리가 의미하는 바는 자체 스택을 의미하며 스레드 내부에서 초기화되는 모든 구조는 해당 스택의 메모리에 할당되어야합니다. Thread-safe 한 Glib은 확실히 흥미로운 것입니다. 나는 그것에 대해 확신하지 못한다. 내 개념을 지울 수있는 도움을 원합니다 :) – Abdullah

+0

해시 맵의 초기화 코드를 질문에 추가했습니다. – Abdullah

+0

괜찮습니다. 그러나 'g_hash_table_new'팩토리 함수를 호출하고 거기에서 무슨 일이 일어나고 있는지 알 수 없습니다. –

관련 문제