cosumer生产者中的wait_queue(linux)

时间:2016-10-03 08:15:21

标签: c linux multithreading

我正面临在linux上构建一个简单的设备驱动程序。特别是设备应该像管道,fifo行为,并管理读者和作家。我决定在oder中使用spinlock和wait_queue来控制线程流和并发。因为我需要fifo线程'操作,我做了一个简单的列表,让线程在所有的位置获得一个位置,所以它可以在第一个时间(选择性唤醒)。

typedef struct t_node
{
    struct task_struct *process;
    struct t_node *next;
    struct t_node *prev;
} t_node;

我的问题是关于wait_evet方法的条件。事实上,如果没有可用的空间(数据)或者线程早先到达,两个作者(读者)都必须睡觉。

当作家入睡时,它应该等待列表的第一个和可用空间:

wait_event_interruptible(queue, !node.prev && spaceEnough())

我想找到一种以互斥方式读取条件的方法,而不需要任何其他线程来编写它。 请注意,通过以下方式调用唤醒:

wake_up_process(list.head)

我怎么能达到这个目标?

0 个答案:

没有答案