这是来自Linux编程接口(interface)的程序(原始代码here)。我想做的是使用pthread_create()为以下列出的目标向threadFunc发送2个“参数”:
为了实现这些目标,我创建了一个包含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
我的问题是:
非常感谢你。
最佳答案
您将在主函数中获取newArguments
的地址,并将其传递给线程函数。这意味着它不再是struct
而是指向struct
的指针,因此您将需要使用->
。
您可以使用其他方法来完成x->y
,即(*x).y
,看来这可能正是您尝试使用*(arg.loops)
实现的,但这样做有两个问题:
args.loops
-您应该执行(*args).loops
;和args
是错误的类型,无论如何要取消引用,您需要一个指向结构的指针,因此它将是(*threadFuncArgs).loops
。 因此,解决此问题的一种方法是改用此方法:
struct arguments * threadFuncArgs = arg;
int threadFuncLoops = threadFuncArgs->loops;
需要注意的另一件事。传递给两个线程的指针是指向完全相同的内存的指针。这意味着,如果其中一个线程发生更改(例如,结构中的
self
字段),则两个线程都会更改。通常,您可以通过(至少)两种方式之一来解决此问题: