首页 > > > pthread_create 记录线程使用
最近在做的项目充电LED灯闪烁
正常的HAL层代码是这样的


想要实现闪烁功能,只需要向驱动的blink节点写入值就可以。
但是我们的平台没有这个节点,那我只能在HAL层实现这个功能,重写驱动也是可以的,不过我认为这样更省事。
err = pthread_create(&tid, NULL, BlinkThread,(void*)&blink);
if(err!=0)
LOGE(">>> pthread_create error");
static void* BlinkThread(void* param)
{
int err = 0;
static int st_blink = 0;
static char st_red = 0,st_green =0,st_blue=0;
/*专心跑子线程*/
while(1)
{
/*状态改变才打印信息*/
if(st_red != red ||st_blue!=blue||st_blink!=blink||st_green!=green)
{
st_red = red;
st_blue = blue;
st_green = green;
st_blink = blink;
LOGI(">>> BlinkThread blink:%d red:%d green:%d blue:%d ",st_blink,red,green,blue);
}
/*执行下面的代码需要锁住线程*/
pthread_mutex_lock(&g_lock);
if(st_blink)
{
if (red)
{
err |= write_int(RED_LED_PATH, 1);
msleep(onMS);
err |= write_int(RED_LED_PATH, 0);
msleep(offMS);
}
if (green)
{
err = write_int(GREEN_LED_PATH, 1);
msleep(onMS);
err = write_int(GREEN_LED_PATH, 0);
msleep(offMS);
}
if (blue)
{
err = write_int(BLUE_LED_PATH, 1);
msleep(onMS);
err = write_int(BLUE_LED_PATH, 0);
msleep(offMS);
}
}
pthread_mutex_unlock(&g_lock);
}
return NULL;
}其中有一个需要传值的功能,因为是void *参数,传之前要记得强制转换一下,在函数内再进行强制转换一次。
我实际使用的时候,刚开始一直想着传值进去,但是因为是同一个位置,线程和进程是同一个堆空间,但是栈空间是独立的,栈空间是局部变量,不能出现重复。
所以,
如果想让一个进程的几个线程共享一个数据,可以用malloc申请,再进行调用。
刚开始我一直以为用pthread_kill来结束线程,实际上是用不了的,查到一个pthread_cancel但是在Anroid里面移植过时又没有了。用pthread_join又会造成阻塞。
后面我觉得还是pthread_join可以,或者不需要停止线程,在线程里面做判断就好了。_
参考
pthread_mutex_lock()的属性介绍 - 鱼思故渊的专栏 - CSDN博客
如何正确的终止正在运行的子线程 - 大熊先生|互联网后端技术 - 博客园
android bionic缺失pthread_cancel的解决方法
https://stackoverflow.com/questions/4610086/pthread-cancel-alternatives-in-android-ndk
欢迎关注微信公众号-嵌入式Linux
觉得不错,请帮忙转发,点赞,您的每一次支持,我都将铭记于心
原文作者:;如有侵权,请联系管理员删除。