我遇到了线程产生垃圾的问题,我想我找到了问题,我希望有人能证实或反驳我的怀疑并推荐最佳解决方案。
然后在线程调度函数中有
/*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:将结构移动到全局变量部分。这似乎有效,但我知道应该避免使用全局变量。我也不明白为什么这有效?