2012-08-06 4 views
2

thread에 의해 호출되는 함수가 있습니다.이 함수에는 queue :: my_queue라는 고유 한 인수가 있습니다. void * 스레드 스케줄링 중 포인터 캐스팅

void *AddPacket(void *Ptr) 
{  queue<int> my_queue = (queue*)Ptr ; 
     my_queue.push(byte) ; 
} 

주에

, 내가 할 :

int main() 
{ // do business 
    pthread_create(&thread, NULL, &AddPacket, (void*)queue) ; 
} 

을하지만 모두 전환은 잘못 그래서 나는 다음과 같이 스레드에 의해 호출 된 메소드에 무효 포인터에 캐스트를 수행해야합니다.

첫번째 변환 오류로 이어진다

요청 비 클래스 타입 '큐 *'

및 두번째이다 부재 'my_queue'에서 '푸시'용 :

유형 '대기열'에서 '무효 *'유형으로의 캐스트가 유효하지 않습니다.

어떻게 문제를 해결할 수 있습니까?

답변

3

시도 :

queue<int> *my_queue = (queue<int> *)Ptr ; 
my_queue->push(byte) ; 

pthread_create(&thread, NULL, &AddPacket, (void*)&queue) ; 

.. 어쨌든 그 라인을 따라 뭔가 당신은 포인터 타입으로 객체 유형을 캐스팅해야 할

3

. 허용되지 않습니다. 난 당신이 C++에 새로운 생각, 그래서 당신을 unpuzzle 당신이 가야하지만, C++에 대한 책 읽어 보시기 바랍니다 여기에 코드를 수정 게시물 :

queue<int>* my_queue = (queue<int>*)Ptr ; 
my_queue->push(byte) ; 

pthread_create(&thread, NULL, &AddPacket, &queue) ; 

는 C에서 포인터에 대해 읽고 기억 ++ :

+2

가 변화하는 점을 ..needs을 -> 뿐만 아니라. –

+0

아, 맞아. 감사. 추가 된 –

1

을 당신은 스레드 기능 및 스레드 생성을 모두 변경해야

// thread entry point: 
void *AddPacket(void *Ptr) 
{ 
    reinterpret_cast<std::queue<int>*>(Ptr)->push(byte); 
} 

// thread creation: 

std::queue<int> q; 
pthread_create(&thread, NULL, &AddPacket, &q); 
//          ^^^^ **pointer** to "q"; 
//          conversion to void* is implied 
+0

나는 거기에'assert's 몇 개를 추가하여 좋은 결과를 얻었습니다. – marko

관련 문제