并发读写文件描述符

时间:2016-04-14 07:00:03

标签: c++ multithreading select thread-safety uart

我正在尝试将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是否合适。

0 个答案:

没有答案