C++ 套接字 Send() 线程安全

Ten*_*nev 5 c++ sockets multithreading send

我正在为最大 1000 个客户端编写套接字服务器,服务器是关于我的游戏,我使用非阻塞套接字和大约 10 个线程同时从不同的套接字接收数据(第一个线程从 0-100 接收,第二个从 101-200等等..)

但是如果线程 1 要向所有 1000 个客户端发送数据,而线程 2 也想同时向所有 1000 个客户端发送数据,那安全吗?数据在另一(客户端)端是否有可能被弄乱?

如果是,我想唯一可能发生的问题是有时客户端会收到 2 或 10 个数据包作为 1 个数据包,对吗?如果是的话,有什么解决办法吗:(

Nik*_*sov 2

处理许多套接字的通常模式是使用专用线程轮询 I/O 事件select(2),使用poll(2)、 或更好的kqueue(2)epoll(4)(取决于平台)充当套接字事件调度程序。套接字通常以非阻塞模式处理。然后,可能会有一组线程对事件做出反应,并且直接或通过较低级别的缓冲区/队列进行读取和写入。

从队列到事件订阅白板,各种技术都适用于此。在 I/O 级别上复用接受/读取/写入/EOF 以及在应用程序级别上进行事件仲裁会变得很棘手。有几个库喜欢libeventboost::asio帮助构建较低级别(ACE 库也在这个领域,但我不想向任何人推荐它)。您必须自己提出应用程序级协议和状态机(再次boost::statechart可能会有所帮助)。

一些很好的链接可以帮助您更好地了解您所面临的问题(这可能是他们在这里提到的第一百万次):

很抱歉没有提供具体的解决方案,但这是一个非常广泛的设计问题,大多数决策在很大程度上取决于上下文(尽管很有趣)。希望这个对你有帮助。