【问题标题】:How can I use multiple arguments when calling a method with a pthread?使用 pthread 调用方法时如何使用多个参数?
【发布时间】:2020-05-10 15:02:01
【问题描述】:

我的 C 程序有问题,因为我真的不知道如何将 pthread_create 方法与具有多个参数的函数一起使用。 我的代码将在数组中找到素数。因此我不得不使用n 线程,每个线程都在数组的一部分中查找。 这是我的代码的样子:

for (int i = 0; i< n - 1; i++) {
        pthread_create(&threads[i], NULL, checkArrayPart,(size*i, size*(i+1),values));
    }

pthread_create(&threads[n-1], NULL, checkArrayPart,(size*i, size*(i+1),values)));

方法checkArrayPart 如下所示:

 int checkArrayPart(int begin, int end, int arr[]){
     int localCounter = 0;
     for (int i = begin; i <= end; i++) {
        if (isPrime(arr[i])) {
            localCounter++;
        }
    }
    return localCounter;
 }

我试图编译我的代码,但它不工作。我认为问题出在我为新线程提供它将运行的方法的参数的部分。那么,有没有办法在给 pthread 的方法中使用多个参数?

感谢您的帮助。谢谢... :)

【问题讨论】:

  • end 传递的值将小于为begin 传递的值。所以循环不会迭代。
  • 谢谢,我更正了
  • 是的,但这是错误还是发布错误?请复制/粘贴代码。你的代码有-1+1 吗?现在不清楚你在问什么。
  • 只是一个发布错误。以后我会使用复制/粘贴,对不起...所以这意味着我的代码仍然无法正常工作
  • 你可以传递一个结构体。

标签: c multithreading pthreads


【解决方案1】:

那么,有没有办法在给 pthread 的方法中使用多个参数?

是的:您必须将多个参数包装在一个结构中:

struct Args {
  int begin, end;
  int *arr;
};

void *call_checkArrayPart(void *p) {
  struct Args *args = (struct Args *) p;
  int rc = checkArrayPart(args->begin, args->end, args->arr);
  return (void *) rc;
}

在创建时,您需要将 args 打包到这个结构中:

struct Args args[n];
for (int i = 0; i< n - 1; i++) {
  struct Args *arg = &args[i];
  arg->begin = size * i;
  args->end = args->begin + size;
  args->arr = values;
  pthread_create(&threads[i], NULL, call_checkArrayPart, arg);
}

【讨论】:

  • 首先:非常感谢... :) 我有一个理解问题。 struct Args *args = (struct Args *); 的行是什么?我真的是 C 新手,我不明白,这条线要做什么。
  • @Mr.Moose 抱歉,打错了。其实是两个错别字。固定。
猜你喜欢
  • 2013-05-05
  • 2012-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多