我正在尝试将C ++程序中的并发读取和写入连接到UART设备的文件描述符。我正在做的是类似于以下伪代码
fd = get_fd();
make_non_blocking(fd);
while (1) {
check_to_see_if_there_are_writes_pending_and_do_them();
read_all_available_data_and_signal_waiting_threads();
}
线程写入此文件描述符的方式是将其数据块写入队列,然后check_to_see_if_there_are_writes_pending_and_do_them()
函数轮询该队列并进行写入。但正如你们可能注意到的那样,在这里忙着等待。有没有办法可以以某种方式使select()
或poll()
调用释放互斥锁,然后睡眠直到有数据,然后一旦有数据,它再次获取互斥锁然后读取从文件描述符?我可以在select()
函数调用之前添加read_all_available_data_and_signal_waiting_threads()
调用,但我不知道在写入的文件描述符上调用select()
或poll()
是否会导致问题。我在谈论代码如下
fd = get_fd();
make_non_blocking(fd);
while (1) {
check_to_see_if_there_are_writes_pending_and_do_them();
release_mutex_so_writer_threads_can_access();
select(fd);
acquire_mutex();
read(fd);
}
有人可以告诉我一个可以接受的方法吗?或者上述方法是否正常,OS(Mac OSx版本10.11.3)是否为我提供了多路复用和线程安全性?
谢谢!
注意:我在Stack Overflow上的其他地方读过一个似乎与此问题相关的问题,但我不相信我在这里遇到同样的问题。如果我错了,请链接我,我会删除这个问题!
注意:我目前正在使用条件变量来构建线程安全写入队列。我想问一下将select()
或poll()
电话与write()
电话交换到同一个fd是否合适。