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