首页 > 解决方案 > 函数“pthread_create”的参数太多

问题描述

作为标题,我试图弄清楚如何将所有启动例程函数参数传递到我的 pthread 中,但我运气不好

pthread_create(firstThread,NULL,sort,first,first_size);

我正在尝试传入我的排序函数,该函数需要两个参数、数组指针和数组大小,但我不熟悉将多个参数传入线程的语法,我该如何实现?

标签: cmultithreadingsyntaxpthreads

解决方案


pthread_create将单个参数传递给线程函数,并且该单个参数必须是指针。

只有两种主要的方法可以将某些东西传递给线程函数:

  • 传递一个适合void*而不是投射的对象;
  • 或者,在堆上创建一个对象(使用malloc),然后将地址传递给这个新创建的对象给线程函数。在这种情况下,您必须free在使用参数后确保线程函数是内存。
  • 先前选项的一种变体是将指针传递给全局可用的对象(例如,全局变量),但这通常不是可接受的选项。
  • 另一种变体是将地址传递给在调用函数的主体中本地定义的对象,但这在学校示例之外很少有用,因为以这种方式不可能实现并行执行(线程必须在对象之前加入离开调用范围)。

在您的情况下,它可能如下所示:

typedef struct {
    int* arrayPtr;
    size_t arraySize;
} ThreadedSortArgs;

void threadedSort(void* voidArg) {
   ThreadedSortArgs* arg = voidArg;
   // Work with args from arg->arrayPtr, arg->arraySize
   free(arg);
}

// call it somewhere
ThreadedSortArgs* args = malloc(sizeof(ThreadedSortArgs));
pthread_create(firstThread, NULL, threadedSort, args);
// ... 

推荐阅读