2014-10-15 2 views
1

나는 이것을 여러 번 분석했는데 그 원인을 찾아 낼 수 없다. 아마 나는 밀도가 높을뿐입니다. 그러나이 코드가 실행되지 않아야하는 이유는 없습니다. 누구나 그들의 통찰력을 제공 할 수 있습니까?다음 코드의 구조체를 스레드로 전달하면 세그멘테이션 오류가 발생하는 이유는 무엇입니까?

#include <stdio.h> 
#include <pthread.h> 

typedef struct { 
    int a; 
    int b; 
} struct1; 

typedef struct { 
    struct1 s1; 
} struct2; 

void* thread_activity(void* v) 
{ 
    struct2 s2 = *((struct2*)v); 
    printf("%d\n", s2.s1.a); 
    return NULL; 
} 

int main(int argc, char* argv[]) 
{ 
    struct1 s1; 
    s1.a = 10; 
    s1.b = 20; 

    struct2* s2; 
    s2->s1 = s1; 
    pthread_t tid; 

    if(pthread_create(&tid, NULL, thread_activity, s2)==0) { 
     printf("done\n"); 
    } 
} 

답변

5

s2에 메모리를 할당하지 않았습니다. 당신의 프로그램은 심지어 pthread_create에 도착하기 전에 s2->s1 = s1에서 추락 할 가능성이 높습니다. gdb (Linux) 또는 Visual Studio (Windows)와 같은 디버거를 사용하십시오.

당신은 "이것을 여러 번 분석했습니다 ..."라고 말하면 포인터가 유효한 메모리를 가리키고 함수가 올바르게 호출되며 사용 중인지 확인합니다 귀하의 도구 (예 : 경고 수준, 디버거).

1
struct2* s2; 
s2->s1 = s1; 

정의되지 않은 동작! 초기화되지 않은 포인터를 역 참조합니다. 대신 :

struct2 s2; 
s2.s1 = s1; 

그런 다음 &s2으로 pthread_create()에 전달합니다.

0

멀티 스레딩 문제가 아닙니다.

malloc 함수를 사용하여 s1과 s2 모두에 메모리를 할당해야합니다.

3

s2에 공간을 할당하지 않은 것이 맞습니다. 그러나 두 번째 버그가 있습니다. 두 번째 스레드가 완료 될 때까지 기다리지 않고 main()에서 돌아 오는 것입니다. main()에서 반환하면 거기에 선언 된 모든 로컬 함수 변수가 할당 해제되므로 다른 스레드가 해당 스레드에 액세스하는 경우 다른 스레드가 완료 될 때까지 그렇게 할 수 없습니다.

당신은 할 필요가 뭔가 같은 :

struct struct2 s2; 
s2.s1 = s1; 

pthread_t tid; 

if (pthread_create(&tid, NULL, thread_activity, &s2) == 0) 
{ 
    pthread_join(tid, NULL); 
    printf("done\n"); 
} 
관련 문제