Я собираюсь сделать предположение здесь и предположить, что вы пытаетесь построить очередь ImpImage *. Если это так, эта строка:
IplImage** queue[BUFFER_SIZE];
следует читать:
IplImage* queue[BUFFER_SIZE];
И эти строки:
IplImage** buff_get()
{
IplImage** nextfr;
if(frbuff.num_frames == 0)
{
return NULL;
}
nextfr = frbuff.out++;
следует читать:
IplImage* buff_get()
{
IplImage* nextfr;
if(frbuff.num_frames == 0)
{
return NULL;
}
nextfr = *frbuff.out++;
И эти строки:
IplImage **some_image;
some_image = buff_get();
cvShowImage("some_window_somewhere",some_image);
следует читать:
IplImage *some_image;
some_image = buff_get();
cvShowImage("some_window_somewhere",some_image);
Далее у нас есть простая ошибка. Эта строка:
frbuff.in = nextfr;
следует читать:
*frbuff.in = nextfr;
Я удивлен, что современный компилятор C не отклонил код прямо. По крайней мере, это должно быть предупреждение. Если вы используете gcc, я предлагаю передать -Wall -Wextra как минимум для всего нового кода, который вы пишете. Получение вашего кода в форме, которую компилятор принимает без предупреждений, может быть болезненным, но в долгосрочной перспективе, когда вы обнаружите, что не делать это еще более болезненно.
Во-вторых, вы говорите, что используете pthreads. Большая часть вашего кода будет в порядке , если buf_get () всегда вызывается из одного и того же потока, а также для buf_put (). Если buf_get () вызывается из более чем одного потока, то, по крайней мере, ваша очередь будет повреждена, и то же самое для buf_put (). Единственным исключением из всего этого является frbuff.update_flag, который изменяется как от buf_get (), так и от buf_put (). Если buf_get () и buf_put () вызываются из разных потоков, вы можете быть уверены, что update_flag будет содержать неправильные данные.