C で FIFO を実装しています。1 つのスレッドが FIFO に書き込み、もう 1 つのスレッドがそこから読み取っています。
#define BUFFER_LENGTH 1000
struct Frame
{
char data[1024];
unsigned int data_len;
struct Frame* frame;
};
struct Frame * get_from_fifo ()
{
if (!fifo_length)
{
first = last = NULL;
return NULL;
}
struct Frame* frame = first;
first = first->frame;
fifo_length--;
return frame;
}
int add_to_fifo (const char* data, unsigned int frame_size)
{
if (fifo_length >= BUFFER_LENGTH)
{
ast_log(LOG_ERROR, "Buffer full\n");
return SURESH_ERROR;
}
struct Frame* frame = malloc(sizeof (struct Frame));
frame->data_len = frame_size;
memcpy(frame->data, data, frame_size);
if (last)
{
last->frame = frame;
last = frame;
}
if (!first)
{
first = last = frame;
}
fifo_length++;
return SURESH_SUCCESS;
}
関数 *add_to_fifo* と *get_from_fifo* が異なるスレッドによって同時に呼び出されるのを防ぐにはどうすればよいですか? つまり、*get_from_fifo* は、他のスレッドが *add_to_fifo* を実行していないときにのみ呼び出す必要があり、その逆も同様です。