boost asio ioservice 多线程并发做TCP 服务

2019-01-02 20:26发布

int main()
{
    boost::asio::io_service io_svc;
    std::vector<std::thread> vecThread;
    for (int i = 0; i < 5; ++i)
    {
        vecThread.emplace_back(std::thread([](){ io_svc.run(); }));
    }

    return 0;
}

 

如果按上面的代码将一个io_svc 分配多个线程按并发处理,处理的对象是TCP 服务时。发现对同一个TCP 客户端的连接的处理会在多个线程中。

如果是这样的话,那这一个客户端发送过来数据被分成多段后,在服务端会不会乱,而这样我是不是需要加锁控制,可如果加锁的话又应该怎么加呢?

按时我的想法是,如果 是同一个话,它如果只在同一个线程中那么这个我就不用担心了,因为它会顺序到达,那么我收到的头部和数据部就不会被分到两个线程中去了。

这主要问题是TCP 服务端使用异步的方式接收客户端的数据,首先收到固定的头部数据,然后解析头部得到数据部的长度,然后再次异步接收实际的数据。如果这两个步骤被分到了两个线程中去了。导致了这两个部分发生了并发操作,那就尴尬了。

标签:
1条回答
初与友歌
2楼-- · 2019-01-02 20:58

单个线程用于数据接收,放到一个队列,开多个消费线程用于数据处理

查看更多
登录 后发表回答