gpt4 book ai didi

c - 向 pthread_create() 发送多个参数

转载 作者:IT王子 更新时间:2023-10-29 01:26:14 25 4
gpt4 key购买 nike

这是来自 The Linux Programming Interface 的程序(原始代码 here )。我想做的是使用 pthread_create() 向 threadFunc 发送 2 个“参数”对于下面列出的目标:

  1. 第一个在 threadFunc() 的 for 循环中用作迭代器;
  2. 第二个标识当前正在 threadFunc() 中工作的线程。所以它将是线程的某种可打印 ID。

为了实现这些目标,我创建了这个包含 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

我的问题是:

  1. 为什么“循环”不在结构中?它在结构实例中,不是吗?
  2. 具体如何实现目标 2?

非常感谢。

最佳答案

您正在获取主函数中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 字段,两者都会发生变化。

通常,您会通过(至少)两种方式之一解决此问题:

  • 有一个结构数组,并确保每个线程都有一个唯一的结构,只为它自己;或
  • 让线程将其信息复制到本地存储中,尽管这需要进行一些重新设计以确保主函数在完成之前不会创建第二个线程。

关于c - 向 pthread_create() 发送多个参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33558556/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com