描述
我需要将向量转换为void *,以便我可以将它作为参数传递给通过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 :(得分:1)
错误的问题。 &LT 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;
}
答案 1 :(得分: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];
}
输出:
1 2 3
在这个例子中,v1
是向量而不是向量本身的指针。它是指针的基地址。当你采用v1[0]
然后你采取实际的向量。您已将向量(不是向量)的地址传递给pthread (&x)
,这就是为什么需要将其类型化为向量指针然后向量的原因。