这是来自Linux编程接口的程序(原始代码here)。我想要做的是发送2"参数"使用pthread_create()进行threadFunc以实现下列目标:
为了实现这些目标,我创建了包含2个成员变量的结构:
struct arguments {
int loops;
pthread_t self;
};
这个函数循环' threadFuncLoops'倍增全局变量' glob'
static void * threadFunc(void *arg)
{
struct arguments * threadFuncArgs = arg;
int threadFuncLoops = *(arg.loops);
for (int j = 0; j < threadFuncLoops; j++) {
// Something happens to glob
}
return NULL;
}
在main()中我创建了2个线程(t1,t2)并将它们发送到threadFunc():
struct arguments newArguments;
s = pthread_create(&t1, NULL, threadFunc, &newArguments);
s = pthread_create(&t2, NULL, threadFunc, &newArguments);
但编译器在threadFunc()
中说request for member 'loops' in something not a structure or union
我的问题是:
非常感谢。
答案 0 :(得分:2)
您正在使用main函数中的newArguments
的地址并将其传递给您的线程函数。这意味着它不再是struct
而是指针到struct
,因此您需要使用->
。
你可以使用其他方式x->y
(*x).y
,看起来这可能是你试图通过{{1}实现的目标但是有两个问题:
*(arg.loops)
这不是指针 - 您应该args.loops
;和(*args).loops
是一个错误的取消引用类型,你需要一个指向结构的指针,所以它应该是args
。因此,解决此问题的一种方法是使用此方法:
(*threadFuncArgs).loops
另外需要注意的事项。传递给两个线程的指针是指向完全相同的内存的指针。这意味着,如果其中一个线程发生更改(例如,结构中的struct arguments * threadFuncArgs = arg;
int threadFuncLoops = threadFuncArgs->loops;
字段,则它将更改为两者。
通常情况下,你会以(至少)两种方式之一解决这个问题:
答案 1 :(得分:1)
你必须使用“ - &gt;”。用threadFuncArgs-&gt;循环替换arg.loops。