提升asio stream_descriptor和事件fd线程安全性

时间:2018-01-17 08:55:28

标签: c++ multithreading boost boost-asio

根据{{​​3}} 属性部分

eventfd 线程安全

  

属性顶部
         有关本节中使用的术语的解释,请参见
         属性(7)。

   ┌──────────┬───────────────┬─────────┐
   │Interface │ Attribute     │ Value   │
   ├──────────┼───────────────┼─────────┤
   │eventfd() │ Thread safety │ MT-Safe │

我想用eventfd包裹boost::asio::posix::stream_descriptor所以我可以在 boost :: asio :: io_service 中使用它。

根据boost stream_descriptor man pagesstream_descriptor 线程安全

  

螺纹安全
  不同的物体:安全。
  共享对象:不安全。

因此,如果我理解正确,使用boost::asio async_read_some / write_some进行读/写是不安全的,其中多个线程来自/ {eventfd 1}}用stream_descriptor包裹。

这是"降级",因为原生eventfd允许它。

我的理解是否正确?

1 个答案:

答案 0 :(得分:2)

确实

一些准确性:

  • 线程安全适用于eventfd来电,而非fd
  • 无论如何,fd是线程安全的,你可以自由地对它们进行系统调用
  • 不是"降级"当然因为你仍然可以像以前一样使用fd(没有人强迫你使用非线程安全的对象)

没有什么能阻止你创建绑定到同一个fd的两个实例。 只需使用release()即可避免(双倍)关闭。

此处有类似/相关的答案:How to avoid data race with `asio::ip::tcp::iostream`?