C++ boost::asio::io_服务::poll()的问题
以下代码:C++ boost::asio::io_服务::poll()的问题,c++,boost,boost-asio,C++,Boost,Boost Asio,以下代码: /***************************************************************************/ boost::mutex m; struct func { func(int v):n(v) {} void operator()() { { boost::mutex::scoped_lock l(m); std::cout << "run function " <
/***************************************************************************/
boost::mutex m;
struct func {
func(int v):n(v) {}
void operator()() {
{ boost::mutex::scoped_lock l(m);
std::cout << "run function " << n << std::endl;
}
for ( int idx = 0; idx < 4; ++idx ) {
{ boost::mutex::scoped_lock l(m);
std::cout << "function " << n << ", ping " << idx << std::endl;
}
sleep(1);
}
}
private:
int n;
};
/***************************************************************************/
int main(int argv, const char** argc) {
boost::asio::io_service io;
for ( int idx = 0; idx < 4; ++idx ) {
io.post(func(idx));
}
std::cout << "before run" << std::endl;
io.poll();
std::cout << "after run" << std::endl;
std::cin.get();
return 0;
}
/***************************************************************************/
但是,根据文件:
函数的作用是:运行
准备好运行,无阻塞,
直到io_服务停止
或者没有更多现成的处理程序
poll()-是一种非阻塞方法。
有什么问题吗
第二个问题:
文件中说:
返回所需的处理程序数
他们被处决了
如果它是非阻塞的,它将返回什么值?-队列中的对象数?-但这与“已执行的”不同。非阻塞与异步不同。池同步运行准备运行的处理程序,并在不阻塞和等待其他处理程序的情况下返回 补充说明。 阻塞输入操作是在未找到输入数据时启动无休止等待的操作。考虑读取操作,它应该从某个端口读取一个字节,但是没有传入的数据。在这种情况下,Read调用挂起,仅在收到字节时返回。如果没有输入信息,非阻塞读取操作将立即返回
池操作是非阻塞的。它同步执行所有挂起的请求和返回。如果没有传入请求,poll将立即返回。这是一个老问题,但您从未真正得到关于run vs poll的答案 io_服务::只要有事情要做,run就会继续运行,例如等待截止时间计时器或io完成通知等。这就是为什么有工作对象要阻止run退出的原因 io_service::poll将只执行准备就绪的处理程序,并且在没有更多的处理程序准备好进行调度之前不会返回 换句话说,run将等待挂起的处理程序准备就绪,比如计时器或IO完成通知,而poll将在这种情况下返回
如果要执行一些空闲处理,此行为非常有用 事实上,poll()在所有处理程序完成之前不会返回控件。非阻塞意味着:它不会长时间手动,也不会包含无休止的等待。阻塞操作将执行挂起的处理程序,并通过等待下一个处理程序进行阻塞。当队列为空时,非阻塞操作返回。异步操作启动一些处理(可能在另一个线程中)并立即返回。同步操作仅在所有工作完成时返回。您将非阻塞操作理解为异步操作。轮询功能是非阻塞和同步的。ok。请解释run()和poll()之间的区别?在我的示例中,我看不到区别。在以下代码中:void func1(int c){for(int I=0;I
**before run**
run function 0
function 0, ping 0
function 0, ping 1
function 0, ping 2
function 0, ping 3
run function 1
function 1, ping 0
function 1, ping 1
function 1, ping 2
function 1, ping 3
run function 2
function 2, ping 0
function 2, ping 1
function 2, ping 2
function 2, ping 3
run function 3
function 3, ping 0
function 3, ping 1
function 3, ping 2
function 3, ping 3
**after run**