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

时间:2015-11-22 13:18:38

标签: c++ sockets thread-safety sfml

我有一个NetworkDevice类,它运行std::thread来排队所有传入的数据包。在执行此操作时,我还想在同一sf::UdpSocket上发送数据包。 我找不到任何有关发送和放大的信息。接收sf::UdpSocket的方法是线程安全的。

该课程看起来像这样:

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. 有第二个插座只是为了发送?

2 个答案:

答案 0 :(得分:1)

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

除非程序包具有严重的实现特性,否则我认为它也是线程安全的:没有固有的原因导致它无法实现。你当然不需要单独的套接字来发送和接收。这真是浪费。

答案 1 :(得分:0)

因为我找不到任何证据sf::UdpSocket::Send&amp; sf::UdpSocket::receive是线程安全的,我认为它们不是。