我正在通过传递一个结构并运行一些问题来创建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 *'”。
通过这种方式添加动态数组,我走错了路吗?
感谢任何人提供的任何帮助。
答案 0 :(得分: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或者提升,所以你很有可能std::thread
或boost::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();
}
不要摆弄线程内部,不需要手动内存管理。