我遇到线程产生垃圾的问题,我想我发现了问题,我希望有人可以证实或反驳我的怀疑并推荐最佳解决方案。
然后在线程调度功能中有
/*global variables*/
struct passArgs
{
int length;
char match;
char** data;
};
在线程调度功能......
struct passArgs args;
pthread_t thrd[ALPHA_LENGTH];
args.data = data;
args.length = tt;
for(int i = 0; i < ALPHA_LENGTH; i++)
{
args.match = (char)(i+65);
pthread_create(&thrd[i], NULL, &processData, &args))
}
这不起作用,因为当processData()
红色结构传递给局部变量的参数时,它们已经被for循环的下一次迭代覆盖了。
解决方案1:创建一个结构数组。
struct passArgs args[ALPHA_LENGTH];
for(int i = 0; i < ALPHA_LENGTH; i++)
{
args[i].data = data;
args[i].length = tt;
args[i].match = (char)(i+65);
}
在函数processData()
中,这产生了编译错误“取消引用指向不完整类型的指针”。
processData从结构创建局部变量,如下所示
struct passArgs *myArgs = (struct passArgs *)ptrToArgs;
char** words = (*myArgs).data;
const int length = (*myArgs).length;
const char responsibleFor = (*myArgs).match;
解决方案2:将结构移动到全局变量部分。这似乎有效但我知道应该避免全局变量。我也不明白为什么会这样?