2017-03-25 7 views
0

설명벡터 <int>을 void *로 변환하고 벡터 <int>으로 다시 변환하는 방법은 무엇입니까?

내가 pthread를 통해 호출 함수에서 매개 변수로 전달할 수 있도록, 무효의 *에 벡터를 변환해야합니다. 그 함수에서, 나는 요소에 접근하기 위해 void *를 벡터로 다시 변환해야한다.

코드

void* compare(void* x) { 
    vector<int>* v = (vector<int>*)x; 
    vector<int> v1 = v[0]; 
    vector<int> v2 = v[1]; 
    ... 
} 

int main() { 
    ... 
    vector<int> x = {1, 2, 3, 4}; 
    pthread_create(&threads[i], NULL, compare, static_cast<void*>(&x)); 
    ... 
} 

문제

V 2 별도의 벡터를 포함 왜 이해가 안 돼요. 또한 유효한 값은 v1과 v2 사이에서 회전합니다. 때때로 하나는 쓰레기이고 다른 하나는 유효한 값을가집니다. 이 문제는 내 캐스팅/변환 또는 내 스레드 동기화 문제가 있습니까?

+0

을 시도해보십시오'INT V1 = (* V) [0]'v'는 벡터가 아닌 벡터에 대한 포인터입니다'때문이다. –

+0

std :: copy를 사용하거나 C++ 11을 사용하는 경우 static_cast –

+1

C 언어에는 이나 다른 템플릿이 없습니다. 그래서'c' 태그를 제거하십시오 – user3629249

답변

0
void* compare(void* x) { 
    vector<int>* v1 = (vector<int>*)(x); 
    vector<int> v = v1[0]; // it will always be v[0] 
    cout << v[0] << " " << v[1] << " " << v[2]; 
} 

int main() { 
    pthread_t thread; 
    vector<int> x = {1, 2, 3, 4}; 
    pthread_create(&thread, NULL, compare, static_cast<void*>(&x)); 
    pthread_join(thread, NULL); 
} 

또는

void* compare(void* x) { 
    vector<int> v = ((vector<int>*)x)[0]; 
    cout << v[0] << " " << v[1] << " " << v[2]; 
} 

출력이 예에서는 v1

1 2 3 

자체 벡터하지 벡터에 대한 포인터이다. 포인터의 기본 주소입니다. v1[0]을 가져 가면 실제 벡터를 취합니다. 벡터 포인터 (벡터가 아님)를 주소 (&x)에 전달 했으므로 벡터 포인터와 벡터로 타입 변환해야합니다.

1

잘못된 질문입니다. 인수 유형을 처리하는 방법을 알고 <g> 사용 std::thread :

void f(std::vector<int>& arg); 

int main() { 
    std::vector<int> argument; 
    std::thread thr(f, std::ref(argument)); 
    thr.join(); 
    return 0; 
}