C 中的 Void 参数
Void Parameters in C
我正在使用 pthreads 并使用一个名为 'runner' 的函数来指定在线程上使用哪些方法。
这是我的转轮函数:
void *runner(void* param){
int* parm = (int*) param;
if(parm == 1){
MergeSort(intArr, 0, (fileLen/2));
}
if(parm == 2){
MergeSort(intArr, (fileLen/2)+1, fileLen - 1);
}
if(parm == 3){
Merge(intArr, 0, (fileLen/2), fileLen - 1);
}
pthread_exit(0);
}
我的问题是当我在 main 中创建这个线程时,我得到一个编译器错误:"warning: comparison between pointer and integer"。
pthread_create(&tid1, &attr1, runner, 1);
我一直在尝试不同的方法来转换整数,但我仍在努力寻找正确的方法。
第一种方法是
- 创建一个
int
对象 param
来保存您要传递的值。
- 获取指向该对象的指针:
¶m
- 将
int *
指针转换为 void *
指针。
- 将
void *
指针传递给 pthread_create
即创建线程时,做
int param = 1;
int *pparam = ¶m;
void *vpparam = (void *) pparam;
pthread_create(&tid1, &attr1, runner, vpparam);
以上可以压缩成
int param = 1;
pthread_create(&tid1, &attr1, runner, ¶m);
做同样的事情。
现在,在线程函数中,我们必须反向执行所有操作
- 在线程函数中接收到那个
void *
指针
- 将收到的
void *
指针转换为int *
类型
- 取消引用指针以检索
int
值
所以,在线程函数中我们做
void *runner(void* param) {
int *pparam = (int *) param;
int parm = *pparam;
if (parm == 1){
...
}
...
}
或者更简洁
void *runner(void* param) {
int parm = *(int *) param;
...
请注意,在这种方法中,线程函数将取消引用一个指针,以访问我们在 pthread_create
调用之前创建的同一个 int param
对象。只要线程运行,保持 int
对象处于活动状态通常很重要。
或者,您可以尝试更 "hackerish" 的方法:将所需的 int
值转换为 void *
类型并将其直接传递给 pthread_create
void *vparam = (void *) (uintptr_t) 1;
pthread_create(&tid1, &attr1, runner, vparam);
并在线程函数中将接收到的void *
指针转换回int
类型
void *runner(void* param) {
int parm = (int) (uintptr_t) param;
if(parm == 1){
...
}
...
}
前一种方法在直觉上更简洁并且通常更可扩展,如果有一天您想要传递比单纯的 int
.
更重的东西
I've been trying different ways to cast the integer but I'm still struggling to find the correct way
试试这个:
pthread_create(&tid1, &attr1, runner, (void*)(intptr_t)1);
并在线程函数中:
void *runner(void* param){
int parm = (int)(intptr_t)param;
pthread_create
期望它的第四个参数是 void*
,对应于 runner
的 void*
输入,但你传递给它的是 int
.相反,创建一个 int
变量并将其 地址 作为第四个参数传递,例如:
int param = 1;
pthread_create(&tid1, &attr1, runner, ¶m);
该函数接受一个void*,一个空指针。在 C 中,void 指针用于指向内存中未指定的类型。这是在 C++ 发明模板之前用于泛型的东西
std::vector<int> vector;
因为参数是指针,正如 AnT 所说,您应该将指针传递给函数。上面的代码看起来很有效。如果你愿意,你可以投
pthread_create(&tid1, &attr1, runner, (void*)1);
我正在使用 pthreads 并使用一个名为 'runner' 的函数来指定在线程上使用哪些方法。
这是我的转轮函数:
void *runner(void* param){
int* parm = (int*) param;
if(parm == 1){
MergeSort(intArr, 0, (fileLen/2));
}
if(parm == 2){
MergeSort(intArr, (fileLen/2)+1, fileLen - 1);
}
if(parm == 3){
Merge(intArr, 0, (fileLen/2), fileLen - 1);
}
pthread_exit(0);
}
我的问题是当我在 main 中创建这个线程时,我得到一个编译器错误:"warning: comparison between pointer and integer"。
pthread_create(&tid1, &attr1, runner, 1);
我一直在尝试不同的方法来转换整数,但我仍在努力寻找正确的方法。
第一种方法是
- 创建一个
int
对象param
来保存您要传递的值。 - 获取指向该对象的指针:
¶m
- 将
int *
指针转换为void *
指针。 - 将
void *
指针传递给pthread_create
即创建线程时,做
int param = 1;
int *pparam = ¶m;
void *vpparam = (void *) pparam;
pthread_create(&tid1, &attr1, runner, vpparam);
以上可以压缩成
int param = 1;
pthread_create(&tid1, &attr1, runner, ¶m);
做同样的事情。
现在,在线程函数中,我们必须反向执行所有操作
- 在线程函数中接收到那个
void *
指针 - 将收到的
void *
指针转换为int *
类型 - 取消引用指针以检索
int
值
所以,在线程函数中我们做
void *runner(void* param) {
int *pparam = (int *) param;
int parm = *pparam;
if (parm == 1){
...
}
...
}
或者更简洁
void *runner(void* param) {
int parm = *(int *) param;
...
请注意,在这种方法中,线程函数将取消引用一个指针,以访问我们在 pthread_create
调用之前创建的同一个 int param
对象。只要线程运行,保持 int
对象处于活动状态通常很重要。
或者,您可以尝试更 "hackerish" 的方法:将所需的 int
值转换为 void *
类型并将其直接传递给 pthread_create
void *vparam = (void *) (uintptr_t) 1;
pthread_create(&tid1, &attr1, runner, vparam);
并在线程函数中将接收到的void *
指针转换回int
类型
void *runner(void* param) {
int parm = (int) (uintptr_t) param;
if(parm == 1){
...
}
...
}
前一种方法在直觉上更简洁并且通常更可扩展,如果有一天您想要传递比单纯的 int
.
I've been trying different ways to cast the integer but I'm still struggling to find the correct way
试试这个:
pthread_create(&tid1, &attr1, runner, (void*)(intptr_t)1);
并在线程函数中:
void *runner(void* param){
int parm = (int)(intptr_t)param;
pthread_create
期望它的第四个参数是 void*
,对应于 runner
的 void*
输入,但你传递给它的是 int
.相反,创建一个 int
变量并将其 地址 作为第四个参数传递,例如:
int param = 1;
pthread_create(&tid1, &attr1, runner, ¶m);
该函数接受一个void*,一个空指针。在 C 中,void 指针用于指向内存中未指定的类型。这是在 C++ 发明模板之前用于泛型的东西
std::vector<int> vector;
因为参数是指针,正如 AnT 所说,您应该将指针传递给函数。上面的代码看起来很有效。如果你愿意,你可以投
pthread_create(&tid1, &attr1, runner, (void*)1);