我正面临在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)
我怎么能达到这个目标?