C++ Boost::ASIO:在多个线程上使用tcp::socket

C++ Boost::ASIO:在多个线程上使用tcp::socket,c++,multithreading,boost,tcp,boost-asio,C++,Multithreading,Boost,Tcp,Boost Asio,因此,我有一个TCP服务器,它在特定端口上等待客户端连接 如果有一个客户端连接,我用一些asio::io\U服务构建一个tcp::socket对象,然后我接受该套接字。例如: void Gateway::server(boost::asio::io_service& io_service, unsigned short port) { tcp::acceptor a(io_service, tcp::endpoint(tcp::v4(), port)); bool UAR

因此,我有一个
TCP
服务器,它在特定端口上等待客户端连接

如果有一个客户端连接,我用一些asio::io\U服务构建一个
tcp::socket
对象,然后我接受该套接字。例如:

void Gateway::server(boost::asio::io_service& io_service, unsigned short port) {
    tcp::acceptor a(io_service, tcp::endpoint(tcp::v4(), port));
    bool UARTToWiFiGatewayStarted = false;

    for (;;) {
        tcp::socket sock(io_service);

        a.accept(sock);

        std::thread(startWiFiToUARTSession, std::move(sock)).detach();

        if(false == UARTToWiFiGatewayStarted) {
            //std::thread(startUARTToWifiSession, std::move(sock2)).detach();
            UARTToWiFiGatewayStarted = true;
        }
    }
}

现在,我想在至少两个线程上使用此套接字的功能,一个线程将从套接字读取(阻塞)数据(
read_some(…)
),另一个线程需要使用该套接字写入(阻塞)数据

我试图使用相同的
asio::io_服务
对象构建两个
tcp::socket
对象,但这不起作用

有什么想法吗?

该对象旨在获得本机套接字的所有权,并提供管理本机套接字的语义。因此,单个
socket
对象应该引用离散的本机套接字。否则,基础套接字的状态可能会意外更改

虽然
socket
文档指定在单个共享
socket
上进行并发调用是不安全的,但文档说明了此规则的一个例外。从Asio 1.4.0/Boost 1.37开始,如果操作系统支持,则在
套接字
对象上同时执行的同步读、写、接受和连接操作是线程安全的:

Asio 1.4.0/Boost 1.37

  • 同步读、写、接受和连接操作现在是线程安全的(这意味着,如果操作系统支持,现在可以在单个套接字上执行并发同步操作)

在这种情况下,如果操作系统支持,则在一个线程中同步读取套接字,并在另一个线程中同步写入同一套接字是线程安全的。

什么是“不工作”?“在至少两个线程上使用此套接字的功能”--您的意思是同一个连接到单个客户端?每个
tcp::socket
对象都应该引用一个离散的本机套接字。你能解释一下为什么想要为一个tcp连接使用两个
tcp::socket
对象吗?@TannerSansbury我想要两个
tcp::socket
对象来引用同一个离散的本机套接字。我之所以想要这个,是因为我无法在两个线程之间共享现有的对象。@Marius为什么不能通过引用、
shared_ptr
等在两个线程之间共享单个
tcp::socket
对象?
tcp::socket
对象旨在获得本机套接字的所有权。拥有两个声称拥有同一个本机套接字的
tcp::socket
对象可能会增加不必要的复杂性。