坑位描述:新增了一个线程函数,该线程函数入参为指针或者变量(即传地址或传值),在启动该线程的局部调用函数中,给线程传入的变量或者指针是局部变量或局部变量的指针,这样极大概率因该线程优先级不够高或者cpu调度不及时导致启线程较慢,调用线程的局部函数已经执行完了,同时释放局部变量和局部变量的指针内存,造成线程入参值为0.
入坑场景1:
void *runner(int *param)/*子线程将会执行这个函数,入参值应大于0*/
void tmp_func()
{
int a = 2;
pthread_create(NULL, NULL, runner, &a);/*创建一个线程*/
return;/*线程中真正执行的时候a的值为0了,不是2*/
}
入坑场景2:消息队列处理线程,主线程启子线程(有入参),如传片段视频,每一个片段由一个线程单独发送.
mqd_t memAvailMsgQ;
void *runner(int *param)/*子线程将会执行这个函数,入参值应大于0*/
void tmp_func()
{
int a = 0 ;
int iRetVal = -1;
while(1)
{
a = 0;
iRetVal = mq_receive(memAvailMsgQ, (int *)&a, sizeof(int), WAIT_FOREVER, NULL);
if (iRetVal == sizeof(int))
{
pthread_create(NULL, NULL, runner, &a);/*创建一个线程*/
}
}
return;
}
心得体会:
(1)线程尽量设计成不带入参的,如果设计有入参的,传参使用全局变量或者静态变量。
(2)若线程设计成有入参,且传参的时候就是要传局部变量或局部变量指针,可采用多传一个局部变量(如int a)的地址,在启用该线程的外部函数中采用while循环等待判断结构,在外部函数中给a赋一个初值a=1;在线程中改变这个值,如a=2;外部函数while判断条件判断a==2,如果成了说明线程已经起来,外部调用局部函数就可以退出while循环往下执行。
int a = 1;
while(2 != a)
{
usleep(200*1000);/*等待200毫秒*/
}
(3)有种特殊情况等待子线程执行完后主线程才能继续往下执行则可以使用pthread_join进行阻塞等待。如需要异步执行且有入参的,确保入参传入主线程才能释放或者重置入参入值。
写在尾部:
大家多总结,多分享,做事更高效,生活更美好,人生才会更有意义!总结了很多没有分享那没有多大意义。为此,捡起多年不更新的公众号,打算当成一个记录手册,把自己的技术所得,生活感悟和人生所获积极正能量,有意义的事记录下来,有兴趣的朋友可以关注我的公众号,一起做交流学习。