2012-10-20 6 views
0

이 같은 구조체가 :스레드 함수에서 값을 반환하려면 어떻게해야합니까?

struct data{ 
    int x; 
    int y; 
} 

및 I는 다음과 같습니다 스레드 기능이 있습니다

void *threadFunction(void *item){ 
    data *myData = (data*) item; 
    int first = 50; 
    int second = 10; 
    myData->x = first; 
    myData->y = second; 
    return(void*) myData; 
} 

나는이 같은 스레드 함수를 호출을 주() :

pthread_create(threadID, NULL, threadFunction, &item); 

하지만이 값을 사용하여 main()에 다시 쓰레드의 값을 가져 오려고 할 때 :

struct data* returnedItem; 
pthread_join(threadID, (void**) returnedItem; 
cout << returnedItem->x << returnedItem->y; 

내 프로그램이 아무 것도하지 않는 것 같은데 어떻게되는지 모르겠습니다. 컴파일되고 실행되지만 어딘가에 무한 루프되거나 그냥 기다립니다. 전혀 어떤 일이 일어날 지 모르겠다. 나는 어떤 종류의 응답도받지 못한다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? pthread_join 문에서 값을 검색하기 위해 main()에없는 것이 있습니까? 나는 성명서에서 주장을 망쳐 놨 을까?

+1

원래 물건에 대한 포인터를 반환하는 경우'& item'을 계속 사용하십시오 ... –

+2

그건 실제 코드가 아니며 컴파일도되지 않습니다. –

답변

1

귀하의 포인터가 혼란스러워지고 있습니다. 이처럼 수행

void * p; 
pthread_join(threadID, &p); 
data * returnedItem = static_cast<data *>(p); 

그것은 그냥 (귀하의 경우 data *에) 유형 X의 변수가 실제로 유형의 변수 인 척 할 수없는, 에에서 포인터를 변환하고 포인터를 무효화 할 수는 있지만 Y (귀하의 경우 void *). 그것은 허용되지 않으며 정의되지 않은 동작입니다.

+0

도움을 주셔서 감사합니다. 더 이해하기 시작했지만 내 프로그램은 아직 응답하지 않습니다. 포인터를 올바르게 반환합니까? – ahabos

+0

@ahabos : 네, 캐스트가 필요하지 않지만 그래, 맞아. –

+0

오류가 발생하거나 인수를 반환하지 않았 음을 알았습니다. 도와 줘서 고마워, 내가 더 명확하게 지금하고있는 것을 이해한다! – ahabos

1

pthread_join의 두 번째 인수는 스레드의 결과를 반환하는 void *에 대한 포인터를 취하므로 pthread_join(threadID, (void**) returnedItem);을 작성합니다. 그러나 그것에 대해 생각 :

struct data* returnedItem; 
// what is the value of returnedItem?? possibly garbage, lets say it is 0xFEDCBA98 
pthread_join(threadID, (void**) returnedItem); 

* (void**) 0xFEDCBA98 = thread_return_value; 
말, 그래서 당신은 지금 어떤 점에서 pthread_join이 원하는, (** 무효가) 귀하가 제공 한 인수에 스레드의 결과를 쓰기로 그 garbase 캐스팅

하지만 기다려주세요! 당신은 pthread_join을 잘못된 포인터를 존중하게 만들고 심지어 세분화 오류 또는 더 나쁜 정보를 덮어 쓸 수도 있습니다! 따라서 함수가 무언가를 반환 할 방도가 필요할 때마다 유효한 메모리를 제공해야합니다. 올바른 코드는 다음과 같습니다.

pthread_join(threadID, (void**) &returnedItem); 
관련 문제