如何正确地将vector <int>转换为void *并返回vector <int>?

时间:2017-03-25 18:06:31

标签: c++ pthreads

描述

我需要将向量转换为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之间旋转;有时一个是垃圾,另一个是有效值。这是我的转换/转换的问题还是我的线程同步的更大问题?

2 个答案:

答案 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),这就是为什么需要将其类型化为向量指针然后向量的原因。