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


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));
}