multithreading - boost::asio::strand 在 Ubuntu 11.04 (boost_all_dev 1.42) 上是否损坏

标签 multithreading ubuntu boost g++ boost-asio

我有一个使用 io_service 和几个线程的程序。

它实例化了一些套接字对象。这些对象每个都有一个同步链。所有对 async_read()、async_write() 和类似函数的调用都通过 strand_.wrap(boost::bind(...))。每个对象还有一个初始化为 0 的 int interlock_ 变量。

在这些函数之一(on-data-receive 回调)中,我执行以下操作:

Class::startRead(...)
{
...
    boost::asio::async_read(socket_, boost::asio::buffer(ptr, 16384), boost::asio::transfer_at_least(1),
        strand_.wrap(boost::bind(&EagerConnection::on_read, this, placeholders::error, placeholders::bytes_transferred)));
}

Class::on_read(...)
{
...
    startRead();
    assert(0 == __sync_fetch_and_add(&interlock_, 1));
    onData_();
    assert(1 == __sync_fetch_and_add(&interlock_, -1));
}

因为一切都是通过链同步的,所以第一个断言永远不应该触发。不过,确实火了!当我检查 GDB 中的值时,interlock_ 的最终值为 2,这意味着对 on_read() 的两个单独调用同时处于事件状态。

这是否意味着 boost::asio::strand 坏了? (我已经检查过我在完成函数中没有任何重入——onData_ 信号处理程序不会重新调用 on_data())。

“早期” startRead 能否以某种方式导致立即重新进入? (async_x 和 strand 的语义似乎都表明它不能)

如果您真的非常想查看类(class)的完整内容,可以将其作为要点:https://gist.github.com/979212

最佳答案

我发现了一些小问题(?):

  • 次要:interlock_ 的初始化顺序和 strand_被切换。通过声明 interlock_ 来修复它_after_ strand_ 成员;
  • readIn函数不返回值(未初始化的数据)。您可能打算返回 n ?


  • 好消息:
  • 与 valgrind 一起运行变得清晰。
  • 使用 helgrind 运行很清楚(但是:我猜我在最小示例中没有使用线程;不知道 boost::asioboost::signals 内部结构)。
  • 关于multithreading - boost::asio::strand 在 Ubuntu 11.04 (boost_all_dev 1.42) 上是否损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6049229/

    相关文章:

    c++ - 是否有用于标准化类型名称字符串格式的 C++ type_info 的可移植包装器?

    c++ - boost::make_shared 不是在调用(放置)运算符 new 吗?

    c++ - 通过cmake禁用特定库的警告

    python - 当除 main 之外的所有线程都完成时执行操作? (Python)

    java - 关于java多线程的一些问题,

    amazon-web-services - 如何存储托管在 Ubuntu 16.04 上的 dotnet 核心应用程序的 AWS 凭证?

    mysql.service 失败,因为控制进程退出并出现错误代码

    java - 什么是凭空安全?

    java - 使用 ScheduledExecutorService 在同一周期内运行多个线程

    ubuntu - 在ubuntu上安装pyqtgraph