sf::UdpSocket 的发送和接收方法是线程安全的吗?

Are the send and receive methods of sf::UdpSocket threadsafe?

我有一个 NetworkDevice class,它运行 std::thread 来对所有传入的数据包进行排队。在这样做的同时,我还想在同一个 sf::UdpSocket 上发送数据包。 我找不到关于 sf::UdpSocket 的发送和接收方法是否线程安全的任何信息。

class 看起来像这样:

class NetworkDevice
{
   std::thread m_Thread;
   std::mutex m_Mtx;
   bool isRunning;
   sf::UdpSocket m_Socket;
   std::deque<std::pair<Packet, Connection>> m_Packets;

   void listenUdp()
   {
      while(isRunning)
      {
      // Do some stuff
      m_Socket.receive(packet, remoteAddress, remotePort);
      m_Mtx.lock();
      m_Packets.push_back(std::make_pair(packet, Connection(remoteAddress, remotePort)));
      m_Mtx.unlock();
      // Do some stuff
      }
   }

   void startThread();
   {
      isRunning = true;
      m_Thread = std::thread([this](){listenUdp();});
   }

   void sendPacket(Packet& packet, Connection& connection);
   {
      m_Socket.send(packet, connection.address, connection.port);
   }

   void update(std::deque<std::pair<Packet, Connection>>& packets)
   {
      m_Mtx.lock();
      packets = m_Packets;
      m_Mtx.unlock();
   }
};

sf::UdpSocket::sendsf::UdpSocket::receive方法同时使用会不会有什么意想不到的效果?

如果是这样,我宁愿:

  1. 有一个在执行上述命名方法之前被锁定的互斥体?
  2. 有第二个用于发送的套接字吗?

因为我找不到任何证据表明 sf::UdpSocket::Sendsf::UdpSocket::receive 是线程安全的,所以我认为它们不是。

我无法回答您正在使用的包,但在操作系统级别,这些方法是原子的,因此是线程安全的。您可以同时从多个线程调用它们。同时发送和接收将独立进行;同时发送将以某种未定义的顺序自动发生;同时接收也将以某种未定义的顺序自动发生。

除非该包具有严重的实现特性,否则我希望它也是线程安全的:没有内在原因不能做到这一点。您当然不需要单独的套接字来发送和接收。这太浪费了。