通过结构将动态数组传递给pthreads

时间:2013-07-04 05:49:57

标签: c++ arrays struct pthreads

我正在通过传递一个结构并运行一些问题来创建pthreads。使用以下代码,我可以将一组整数放入结构中,然后在线程中使用它们:

struct v{
    int i;
    int j;
};
void* update(void* param);

int main(int argc, char* argv[]){
    ...
    int j = 2;
    int i = 1;
    pthread_t tid;
    pthread_attr_t attr;
    pthread_attr_init(&attr);
    struct v *argument = (struct v*)malloc(sizeof(struct v));
    argument->i = i;
    argument->j = j;
    pthread_create(&tid, &attr, update, argument);
    ...
    pthread_join(tid, NULL);
    return 0;
}
void* update(void* arg){
    ...
    struct v * argument = (struct v*) arg;
    int j = argument->j;
    int i = argument->i;
    cout << j << ' ' << i << endl;
}

不幸的是,我似乎无法在结构中添加动态数组。我知道动态数组不能在main()之前声明的结构中工作,但即使使用指针我似乎也无法获得编译代码。在main()中,我添加了这些行:

int arr[i][j];

下面

argument->j = j;

我补充说:

argument.current = arr;

我将结构更改为:

struct v{
    int i;
    int j;
    int *ray;
};

在更新功能中,我有:

int * curr = argument->ray;

当我编译时,我收到一条错误消息“请求'参数'中的成员'ray',这是非类型'v *'”。

通过这种方式添加动态数组,我走错了路吗?

感谢任何人提供的任何帮助。

1 个答案:

答案 0 :(得分:1)

  

据我所知,动态数组在main()

之前声明的结构中不起作用

他们应该“不工作”吗?只要您正确定义和使用它们,无论在何处声明/定义它们都无关紧要。

int arr[i][j]; - 这是一个VLA,因为ij不是编译时常量。 VLA不是C ++ 03和C ++ 11的一部分,它们是C特性。 C ++ 14将引入类似的东西。

  

argument.current = arr;

     

我将结构更改为:

 struct v{
     int i;
     int j;
     int *ray;
 };

该结构中的current在哪里?难怪它是否无法编译;-)(您可能希望下次提供SSCCE

足够的挑剔,让我们试着解决你的问题:

使用简单指针无法实现二维数组。您可以使用指针代替指针,例如像这样:

struct v{
  int i;
  int j;
  int **ray;
};

但是由于你使用的是C ++,我建议使用矢量或类似的向量。您可以在This SO answer中找到有关二维数组分配的更多信息。

由于你使用的是C ++,你可能正在使用C ++ 11或者提升,所以你很有可能std::threadboost::thread可用,这是一个很好用的环境线程周围的可移植包装器,在你的情况下是pThread。您的代码可能如下所示:

void update(std::vector<std::vector<int>>& param) { //or whatever signature suits your needs
  //...
}

int main() {
  int i = 42;
  int j = 11;
  std::vector<std::vector<int>> myVecVec(j, std::vector<int>(j));

  std::thread theThread( [&](){update(myVecVec);} );
  //or: 
  //std::thread theThread( update, std::ref(myVecVec) );

  //...

  theThread.join();
}

不要摆弄线程内部,不需要手动内存管理。