今天测试时发现程序经常崩溃,代码大意如下:
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));
}