在HTTP Server 3示例中跨线程的boost :: asio套接字共享
我指的是boost :: asio HTTP Server 3的Connection类中的代码http://www.boost.org/doc/libs/1_49_0/doc/html/boost_asio/example/http/server3/connection.cpp
可以看出,每个异步操作都是在boost :: asio :: io_service :: strand上调用的。 这确保了完成处理程序不会被同时调用。 但是,示例服务器可以使用多个调用io_service :: run的线程运行,这意味着可以使用这些线程中的任何一个来调用处理程序。 本例中的所有处理程序都调用boost :: asio :: ip :: tcp :: socket对象上的方法。 对我来说,这是在线程之间共享套接字对象(尽管不是同时调用它的方法)。
我可以看到没有围绕套接字调用的同步,所以我的问题是确保每个线程都具有相同的套接字对象状态视图的机制? 该文档明确指出,共享boost :: asio :: ip :: tcp :: socket的实例是不安全的。
该文档指出tcp :: socket作为共享对象不是线程安全的。
我使用被广泛接受的SGI STL线程安全定义,即:
STL的SGI实现只有在同时访问不同容器是安全的同时,对共享容器的同时读取访问是安全的意义上才是线程安全的。 如果多个线程访问单个容器,并且至少有一个线程可能会写入,则用户负责确保容器访问期间线程之间的相互排斥。
关键词是同步的。 因此,只要访问不是并发的,使用多线程访问共享对象就没有问题。 顺便说一句,这只在一个或多个线程正在写入共享对象时才重要。
套接字对象的状态位于进程的内存空间中,该空间在线程之间共享,因此不能不一致。
希望这回答你的问题!
链接地址: http://www.djcxy.com/p/62673.html上一篇: boost::asio socket sharing across threads in the HTTP Server 3 example