我在C中实现FIFO。一个线程正在写入FIFO,另一个正在从中读取。
#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 *。 ie * get_from_fifo *只应在另一个线程未执行* add_to_fifo *和副verca时调用。
答案 0 :(得分:1)
当您正在实施FIFO堆栈时,仅真正并发的操作是改变堆栈大小(fifo_length
)。
您正在向堆栈的尾部添加条目并从堆栈的头部删除条目,因此这两个操作将永远不会相互干扰。因此,您需要担心的唯一部分是更改堆栈大小(fifo_length
),我会将其放入由互斥锁或标志同步的单独函数中(如上面“Joey”所述)并从两个{调用它{1}}和add_to_fifo()
函数。
答案 1 :(得分:0)
您需要使用互斥(互斥)变量。 pthread库拥有您需要的一切。这是开始查看可用功能的好地方:
http://pubs.opengroup.org/onlinepubs/009695399/basedefs/pthread.h.html
您需要初始化每个线程有权访问的互斥变量: http://pubs.opengroup.org/onlinepubs/009695399/functions/pthread_mutex_init.html
然后你的线程需要在需要访问共享内存时锁定它,然后在使用共享内存完成时将其解锁: http://pubs.opengroup.org/onlinepubs/009695399/functions/pthread_mutex_lock.html
这是一个简单的例子: http://publib.boulder.ibm.com/infocenter/iseries/v5r3/index.jsp?topic=%2Frzahw%2Frzahwe18rx.htm
祝你好运!