pthread_create,传两个参数,在函数里面怎么设置?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pthread_create,传两个参数,在函数里面怎么设置?相关的知识,希望对你有一定的参考价值。
pthread_create(&ntid, NULL, thr_fn,(void *) (&value[i], &i));
void *thr_fn(void *arg)
string msg;
ftpport ftp;
int i, j;
value[i].desfie = (char *) malloc ( sizeof(char) * 32);
for(j = 0; j < 10; j++)
sprintf(value[i].desfie, "%d.dat", j);
free(value[i].desfie);
cout<< "new1 thread:" <<endl;
i = *((int*)arg);
ftpIOIN value = *((ftpIOIN*)arg);
return((void *)0);
这么写就会执行不了
定义一个结构体
struct mypara
var para1;//参数1
var para2;//参数2
将这个结构体指针,作为void *形参的实际参数传递
struct mypara pstru;
pthread_create(&ntid, NULL, thr_fn,& (pstru));
函数中需要定义一个mypara类型的结构指针来引用这个参数
void *thr_fn(void *arg)
mypara *pstru;
pstru = (* struct mypara) arg;
pstru->para1;//参数1
pstru->para2;//参数2
追问
value[i], 本身就是个结构体变量,难道还有包在结构体中吗,好像pthread_create功能中带有传两个参数,就和正常函数一样的,为什么要写成结构体呀?
追答pthread_create函数接受的参数只有一个void *型的指针,这就意味着你只能通过结构体封装超过一个以上的参数作为一个整体传递。这是pthread_create函数的接口限定的,别人已经明确表明我只接受一个参数,你硬要塞给他两个肯定会出错了。所以通过结构体这种组合结构变通一下,同样实现了只通过一个参数传递,但通过结构指针对结构数据成员的引用实现多参数的传递
这种用结构体封装多参数的用法不仅仅用在pthread_create函数中,如果你自己设计的函数需要的参数很多〉=5个以上,都可以考虑使用结构体封装,这样对外你的接口很简洁清晰,你的函数的消费者使用起来也很方便,只需要对结构体各个成员赋值即可,避免了参数很多时漏传、误传(参数串位)的问题
结构体内包含结构体完全没有问题,很多应用都这么使用
laravel 控制器里 redirect url地址传两个参数
public function red_search() { $url=Request::all(); return redirect(‘search/‘.$url[‘category‘].‘/‘.$url[‘term‘]); }
以上是关于pthread_create,传两个参数,在函数里面怎么设置?的主要内容,如果未能解决你的问题,请参考以下文章
将参数传递给 pthread_create - 从 void(*)() 到 void(*)(void*) 的无效转换
如何在 pthread_create() 函数中将矩阵作为参数传递?