boost asio io_service 是否保证两个并行调用链的执行?
Does boost asio io_service guarantee execution of two parallel call chains?
在我的程序中,使用 boost asio io_service,我想要两个并行调用链。两个无限循环写入和读取两个 USB 端口。但是 boost asio io_service 是否保证两个并行调用链的执行?看看这个最小的例子:
#include <boost/asio/io_service.hpp>
#include <functional>
class Chain
{
public:
Chain(boost::asio::io_service &io_service, const std::string &message)
: io_service(io_service)
, message(message)
{}
void call()
{
std::cout << message << std::endl;
io_service.post(std::bind(&Chain::call, this));
}
private:
boost::asio::io_service &io_service;
std::string message;
};
int main()
{
boost::asio::io_service io_service;
Chain chain1(io_service, "1");
Chain chain2(io_service, "2");
chain1.call();
chain2.call();
io_service.run();
return 0;
}
它打印
1
2
1
2
1
...
因为当前 io_service 实现是 fifo 调度程序。保证以后不会打印
1
1
1
1
1
...
?
io_service
目前不保证处理程序的调用顺序。因此,io_service
可以选择仅调用单个调用链。目前,只有 strand
指定保证。
话虽如此,我不会太担心 io_service
目前没有做出保证。由于 Asio 是 on track of becoming the standard networking library,因此可以想象在整个规范过程中都会定义处理程序调度。特别是,io_service
对提议的执行器和调度器的使用应该为调度行为及其选项提供具体保证。
在我的程序中,使用 boost asio io_service,我想要两个并行调用链。两个无限循环写入和读取两个 USB 端口。但是 boost asio io_service 是否保证两个并行调用链的执行?看看这个最小的例子:
#include <boost/asio/io_service.hpp>
#include <functional>
class Chain
{
public:
Chain(boost::asio::io_service &io_service, const std::string &message)
: io_service(io_service)
, message(message)
{}
void call()
{
std::cout << message << std::endl;
io_service.post(std::bind(&Chain::call, this));
}
private:
boost::asio::io_service &io_service;
std::string message;
};
int main()
{
boost::asio::io_service io_service;
Chain chain1(io_service, "1");
Chain chain2(io_service, "2");
chain1.call();
chain2.call();
io_service.run();
return 0;
}
它打印
1
2
1
2
1
...
因为当前 io_service 实现是 fifo 调度程序。保证以后不会打印
1
1
1
1
1
...
?
io_service
目前不保证处理程序的调用顺序。因此,io_service
可以选择仅调用单个调用链。目前,只有 strand
指定保证。
话虽如此,我不会太担心 io_service
目前没有做出保证。由于 Asio 是 on track of becoming the standard networking library,因此可以想象在整个规范过程中都会定义处理程序调度。特别是,io_service
对提议的执行器和调度器的使用应该为调度行为及其选项提供具体保证。