c - 函数“pthread_create”的参数太多
问题描述
作为标题,我试图弄清楚如何将所有启动例程函数参数传递到我的 pthread 中,但我运气不好
pthread_create(firstThread,NULL,sort,first,first_size);
我正在尝试传入我的排序函数,该函数需要两个参数、数组指针和数组大小,但我不熟悉将多个参数传入线程的语法,我该如何实现?
解决方案
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);
// ...
推荐阅读
- c++ - 无法将参数 1 从“_Value_type”转换为“swo::tree”
- javascript - 如何在 Angular 中重新加载组件而不重新加载整个页面
- java - 在 Linux(Jboss) 中部署的 Web 服务无法从 Wndows 中的 WebLogic12C 访问
- c++ - 在布尔上下文中使用具有非类型模板参数包的概念
- android-studio - KMM 应用程序 iproject 模板未显示
- html - Facebook、Whatsapp 和 iMessage 的 OpenGraph 图像标准
- scala - Scala编译器插件将函数定义重写为元组:错误:未找到:值scala.Tuple2
- mysql - MySQL Workbench 错误悬停工具提示为空白
- python-3.x - 在本地执行 ansible 模块代码时出现“No module named library/my_module”错误
- python - 仅当数据框异常值出现在每行 Python 的多个列上时才删除