我正在考虑使用boost ASIO编写多线程tcp服务器。我已阅读了这些教程并查看了一些示例,并且只是想检查一下我的理解是否正确。
服务器将接受来自多个客户端的服务请求的连接。
我的理解如下:
io_service
和一个调用io_service::run()
”io_service::run()
。 io_service::run()
的调用不在一个链中,ergo完成处理程序可以同时运行。 async_write
strand
async_write
io_service
的写入通过strand
序列化,因为它们是线程安全的。async_read()
strand
保护,该线程将用于处理请求我的理解是否正确?这种解决方案是否容易受到竞争条件的影响?
答案 0 :(得分:3)
正如萨姆·米勒所说,你的假设是完全正确的。
但是我想指出一个你可能没有发现过的问题。
strands将序列化async_write(s)是正确的,因此会有线程安全。 但问题不在这里,async_write本身就是线程安全的,如果不在同一个套接字上使用的话。因为你不应该在同一个套接字上插入async_write,所以strands在这里没有帮助。
在调用下一个之前,Strands不会等待先前的async_write完成。只有当套接字上没有任何结构时,你才必须创建一个async_write结构。