您当前的位置: 首页 > 

柳鲲鹏

暂无认证

  • 0浏览

    0关注

    4642博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

线程锁并不是想象的那样可靠

柳鲲鹏 发布时间:2018-12-13 19:19:22 ,浏览量:0

  今天测试时发现程序经常崩溃,代码大意如下:


static  void  fext_queue(ImageBuffer* pSrc)
{
    //>=0表示初始化完成。
    if (g_FextThreadQueue == NULL
        && g_FextThreadQueue->queue_length < GH_FEXT_QUEUE_LENGTH)
    {
        pthread_mutex_lock(&(g_FextThreadQueue->queue_mutex));

     //------------------

        g_FextThreadQueue->queue_length ++;

        pthread_mutex_unlock(&(g_FextThreadQueue->queue_mutex));
    }
}

  这是怎么回事?后来把queue_length输出,发现已经越界了.也就是在加锁期间,值又变化了.所以正确写法是:


static  void  fext_queue(ImageBuffer* pSrc)
{
    //>=0表示初始化完成。
    if (g_FextThreadQueue == NULL
        && g_FextThreadQueue->queue_length < GH_FEXT_QUEUE_LENGTH)
    {
        pthread_mutex_lock(&(g_FextThreadQueue->queue_mutex));

        //从外界进来的时候,有可能增加了.
        if (g_FextThreadQueue->queue_length >= GH_FEXT_QUEUE_LENGTH)
        {
            g_FextThreadQueue->queue_length = 0;
        }

        //-------------------------

        g_FextThreadQueue->queue_length ++;

        pthread_mutex_unlock(&(g_FextThreadQueue->queue_mutex));
    }
}

  或者这样写:

static  void  fext_queue(ImageBuffer* pSrc)
{
    //>=0表示初始化完成。
    if (g_FextThreadQueue == NULL)
    {
        return;
    }

    pthread_mutex_lock(&(g_FextThreadQueue->queue_mutex));

    if (g_FextThreadQueue->queue_length >= GH_FEXT_QUEUE_LENGTH)
    {
        g_FextThreadQueue->queue_length = 0;
    }

    //-------------------------

    g_FextThreadQueue->queue_length ++;
 
    pthread_mutex_unlock(&(g_FextThreadQueue->queue_mutex));
}

 

 

关注
打赏
1665724893
查看更多评论
立即登录/注册

微信扫码登录

0.1852s