Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 运行单元测试似乎会无限期地阻止io_服务_C++_Sockets_C++11_Tcp_Boost Asio - Fatal编程技术网

C++ 运行单元测试似乎会无限期地阻止io_服务

C++ 运行单元测试似乎会无限期地阻止io_服务,c++,sockets,c++11,tcp,boost-asio,C++,Sockets,C++11,Tcp,Boost Asio,我有一个类,它使用asio::generic::stream\u protocol::socket连接到域(asio::local::stream\u protocol::endpoint)和TCP套接字(asio::ip::TCP::endpoint) 为了测试该类,我使用框架在单个文件中进行了一系列单元测试 我突然遇到了一个问题:当运行测试时,它们会被卡住。将-DASIO\u ENABLE\u HANDLER\u TRACKING传递给编译器标志,我可以看到它卡在async\u connec

我有一个类,它使用
asio::generic::stream\u protocol::socket
连接到域(
asio::local::stream\u protocol::endpoint
)和TCP套接字(
asio::ip::TCP::endpoint

为了测试该类,我使用框架在单个文件中进行了一系列单元测试

我突然遇到了一个问题:当运行测试时,它们会被卡住。将
-DASIO\u ENABLE\u HANDLER\u TRACKING
传递给编译器标志,我可以看到它卡在
async\u connect
上。如果我对除一个测试之外的所有测试进行注释,则不会发生这种情况,无论是哪种测试。如果我有两个测试,不管它们是否连接到域或tcp套接字,或者每一个,我都会遇到阻塞

Asio的输出发生变化,但这是一个示例:

$ tests/unit_tests
@asio|1478248907.301230|0*1|deadline_timer@0x7f96f1c07ad8.async_wait
@asio|1478248907.301276|0*2|resolver@0x7f96f1c07ac0.async_resolve
@asio|1478248907.301322|>1|ec=system:0
@asio|1478248907.301328|<1|
@asio|1478248907.302052|>2|ec=system:0,...
@asio|1478248907.302186|2*3|socket@0x7f96f1c07a20.async_connect
@asio|1478248907.302302|<2|
@asio|1478248907.302468|>3|ec=system:0
@asio|1478248907.302481|<3|
@asio|1478248907.302551|0*4|socket@0x7f96f1c07a20.async_send
@asio|1478248907.302611|>4|ec=system:0,bytes_transferred=23
@asio|1478248907.302617|<4|
@asio|1478248907.302621|0*5|socket@0x7f96f1c07a20.async_receive(null_buffers)
@asio|1478248907.356478|>5|ec=system:0,bytes_transferred=0
@asio|1478248907.356547|<5|
@asio|1478248907.356622|0|socket@0x7f96f1c07a20.close
@asio|1478248907.372967|0|deadline_timer@0x7f96f1c07ad8.cancel
@asio|1478248907.372981|0|resolver@0x7f96f1c07ac0.cancel
@asio|1478248907.373509|0*6|deadline_timer@0x7f96f1d00468.async_wait
@asio|1478248907.373526|0*7|resolver@0x7f96f1d00450.async_resolve
@asio|1478248907.374910|>7|ec=system:0,...
@asio|1478248907.374946|7*8|socket@0x7f96f1d003b0.async_connect
@asio|1478248907.375014|<7|
@asio|1478248907.375127|>8|ec=system:0
@asio|1478248907.375135|<8|
$tests/单元测试
@asio | 1478248907.301230 | 0*1 |截止日期_timer@0x7f96f1c07ad8.async_wait
@asio | 1478248907.301276 | 0*2|resolver@0x7f96f1c07ac0.async_resolve
@asio | 1478248907.301322 |>1 | ec=系统:0
@asio | 1478248907.301328 | 2 | ec=系统:0,。。。
@asio | 1478248907.302186 | 2*3|socket@0x7f96f1c07a20.async_connect
@asio | 1478248907.302302 | 3 | ec=系统:0
@asio | 1478248907.302481 | 4 | ec=系统:0,传输的字节数=23
@asio | 1478248907.302617 | 5 | ec=系统:0,传输的字节数=0
@asio | 1478248907.356547 | 7 | ec=系统:0,。。。
@asio | 1478248907.374946 | 7*8|socket@0x7f96f1d003b0.async_connect
@asio | 1478248907.375014 | 8 | ec=系统:0

@asio | 1478248907.375135 |
io\u服务
具有实际执行完成处理程序的
run
run\u one
poll
方法。Boost asio可能有自己的线程,但这些线程的线程状态可能不适合调用处理程序。因此,即使在单元测试中,您也必须弄清楚哪个线程将调用完成处理程序


其次,
run
运行到完成,然后返回。根据您的描述(第一次测试成功,第二次失败),听起来好像您确实调用了
run
,但没有
reset
并重新运行
io\u服务
,问题似乎与我迭代tcp::resolver输出的方式有关。

测试没有失败,只是冻结了。同一类的不同实例可以共享线程吗?Asio的所有用途是否都共享一个状态?@ruipacheco:我们无法判断您的对象是否可以共享线程。Boost asio的状态为
io\U服务
,您可以再次决定是共享一个对象还是使用多个实例<可以从多个线程调用code>io\u service.run()
。能否提供一个?处理程序跟踪输出显示两个
async\u connect
操作已成功完成。如果附加了调试器,那么被阻止线程的回溯是什么?
async\u open
是用户定义的高级操作吗?