作为Boost.Asio的初学者,我很困惑io_service::run().如果有人能在这个方法阻止/解除阻止时向我解释,我将不胜感激.文件指出:
该
run()函数将阻塞,直到所有工作完成,并且不再需要调度处理程序,或者直到io_service停止处理.多个线程可以调用该
run()函数来设置一个线程池,io_service可以从中执行处理程序.在池中等待的所有线程都是等效的,并且io_service可以选择其中任何一个来调用处理程序.
run()函数的正常退出意味着io_service对象已停止(stopped()函数返回true).后续调用run(),run_one(),poll()或poll_one()将除非有预先调用立即返回reset().
以下陈述是什么意思?
[...]不再派遣处理人员[...]
在试图理解行为时io_service::run(),我遇到了这个例子(例3a).在其中,我观察到io_service->run()块和等待工单.
// WorkerThread invines io_service->run()
void WorkerThread(boost::shared_ptr<boost::asio::io_service> io_service);
void CalculateFib(size_t);
boost::shared_ptr<boost::asio::io_service> io_service(
new boost::asio::io_service);
boost::shared_ptr<boost::asio::io_service::work> work(
new boost::asio::io_service::work(*io_service));
// ...
boost::thread_group worker_threads;
for(int x = 0; x < 2; ++x)
{
worker_threads.create_thread(boost::bind(&WorkerThread, io_service));
}
io_service->post( boost::bind(CalculateFib, 3));
io_service->post( boost::bind(CalculateFib, 4));
io_service->post( …Run Code Online (Sandbox Code Playgroud) 什么是异步套接字?它们与普通套接字(阻塞和非阻塞)有什么不同?
该方向的任何指针或教程的任何链接都会有所帮助.
谢谢.
这有点类似于boost :: asio异步性能.由于该问题没有确凿的答案,我发布了一个类似的问题,包含示例代码和统计信息以证明问题.
下面,我对同步和异步服务器应用程序进行了示例,它们在一个循环中连续向客户端发送25字节的消息.在客户端,我正在检查它能够以什么速率接收消息.样本设置非常简单.在同步服务器的情况下,它为每个客户端连接生成一个新线程,并且线程继续在循环中发送25字节的消息.在异步服务器的情况下,它每个客户端连接产生一个新线程,并且线程继续使用异步写入(主线程是调用的线程)在循环中发送25字节的消息ioservice.run().对于性能测试,我只使用一个客户端.
同步服务器代码:
#include <iostream>
#include <boost/bind.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/enable_shared_from_this.hpp>
#include <boost/asio.hpp>
#include <boost/thread.hpp>
using boost::asio::ip::tcp;
class tcp_connection : public boost::enable_shared_from_this<tcp_connection>
{
public:
typedef boost::shared_ptr<tcp_connection> pointer;
static pointer create(boost::asio::io_service& io_service)
{
return pointer(new tcp_connection(io_service));
}
tcp::socket& socket()
{
return socket_;
}
void start()
{
for (;;) {
try {
ssize_t len = boost::asio::write(socket_, boost::asio::buffer(message_));
if (len != message_.length()) {
std::cerr<<"Unable to write all the bytes"<<std::endl;
break;
}
if (len == -1) {
std::cerr<<"Remote …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个游戏服务器,目前,我正在使用线程.每个对象(玩家,怪物)都有自己的线程与while(1)循环,执行特定的功能.
服务器基本上是这样的:
main(){
//some initialization
while(1)
{
//reads clients packet
//directs packet info to a particular object
//object performs some functions
//then server returns result packet back to client
Sleep(1);
}
Run Code Online (Sandbox Code Playgroud)
我听说使用这样的线程使服务器效率不高,我应该考虑使用Boost :: Asio,并使函数异步工作.但我不知道服务器如何工作.如果有人能解释这些服务器的工作原理,我将不胜感激.