0

我正在通过向它们传递一个结构并遇到一些问题来创建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;

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

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

我感谢任何人可以提供的任何帮助。

4

1 回答 1

1

我知道动态数组在 main() 之前声明的结构中不起作用

他们应该以哪种方式“不工作”?只要您正确定义和使用它们,您在哪里声明/定义它们并不重要。

int arr[i][j];- 这是一个 VLA,因为i并且j不是编译时常量。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 或 boost,因此您很有可能获得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();
}

无需摆弄线程内部结构,无需手动内存管理。

于 2013-07-04T06:09:24.483 回答