gpt4 book ai didi

c++ - 在一个线程上用 ppoll 阻塞,在另一个线程上读/写同一个 fds 是否安全?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:54:05 26 4
gpt4 key购买 nike

我正在设计一个程序(C++11,目标 Linux,CentOS 7,如果重要的话),其中一个线程将调用 ppoll 以阻塞多个 fds,而对这些 fds 的任何读/写都将在其他线程上进行.所有这些 fds 都将设置为非阻塞。

当然,我的问题是,我是否需要确保任何特定的 fd 在用于读/写时不被轮询,或者不为此进行任何并发检查是否安全?

select 的手册页提到在轮询时关闭 fd 的多线程问题,但没有提到读/写,轮询和其他相关函数只是返回选择。所以我假设没有问题,但我正在寻找一个权威的来源,比如一个标准,它说是安全的或不安全的。

最佳答案

select 和 poll 方法不是线程安全的。如果你想要一个线程安全的替代方案,你应该看看 epoll。除了 MT 之外,它对于大型文件描述符集来说速度更快。 epoll 方法让内核负责管理 fd 集,这保证您可以使用多个线程在同一个集上等待。

比方说,如果您在一个线程中接收到一个 POLLOUT 事件并将该事件排队等待另一个线程处理它,poll/select 将继续立即返回,直到处理线程完成对 POLLOUT 事件的处理。

使用内核方法轮询多个事件在很大程度上取决于平台。尽管类 UNIX 系统具有类似的方法,但它们根本不可移植。

关于c++ - 在一个线程上用 ppoll 阻塞,在另一个线程上读/写同一个 fds 是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28086871/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com