我正在使用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中创建这个线程时,我得到一个编译器错误:"警告:指针和整数之间的比较"。
pthread_create(&tid1, &attr1, runner, 1);
我一直在尝试不同的方式来投射整数,但我仍然在努力寻找正确的方法。
答案 0 :(得分:3)
第一种方法是
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;
...
请注意,在此方法中,线程函数将取消引用指针,以访问我们在int param
调用之前创建的非常相同的pthread_create
对象。只要线程运行,保持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
更重。
答案 1 :(得分:3)
pthread_create
期望其第四个参数void*
,对应于void*
的{{1}}输入,但您将runner
传递给int
。相反,创建一个int
变量并将其地址作为第四个参数传递,例如:
int param = 1;
pthread_create(&tid1, &attr1, runner, ¶m);
答案 2 :(得分:0)
我一直尝试不同的方式来投射整数,但我仍然在努力寻找正确的方法
试试这个:
StringLengthAttribute Class
并在线程函数中:
pthread_create(&tid1, &attr1, runner, (void*)(intptr_t)1);
答案 3 :(得分:0)
该函数采用void *,一个void指针。在C中,void指针用于指向内存中未指定的类型。它是在C ++发明模板之前用于泛型的东西
std::vector<int> vector;
由于参数是指针,因为AnT表示你应该将函数传递给指针。上面的代码看起来很有效。如果你想要你可以施展
pthread_create(&tid1, &attr1, runner, (void*)1);