ITPub博客

首页 > > > pthread_create 记录线程使用

pthread_create 记录线程使用

作者:dapan 时间:2018-12-24 16:05:25 0 删除 编辑

起源

最近在做的项目充电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博客

如何正确的终止正在运行的子线程 - 大熊先生|互联网后端技术 - 博客园

C++ pthread_create传递参数

android bionic缺失pthread_cancel的解决方法

stackoverflow.com/quest


欢迎关注微信公众号-嵌入式Linux

觉得不错,请帮忙转发,点赞,您的每一次支持,我都将铭记于心

原文作者:;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2020-08-07

  • 博文量
    4504
  • 访问量
    87178