我有一个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::send
和sf::UdpSocket::receive
方法同时发挥作用时,我会有任何意想不到的后果吗?
如果是这样我宁愿:
答案 0 :(得分:1)
我无法回答您正在使用的软件包,但在操作系统级别,这些方法是原子的,因此是线程安全的。您可以同时从多个线程调用它们。同时发送和接收将独立进行;同时发送将以某种未定义的顺序原子地发生;并且同时接收也将以某种未定义的顺序原子地发生。
除非程序包具有严重的实现特性,否则我认为它也是线程安全的:没有固有的原因导致它无法实现。你当然不需要单独的套接字来发送和接收。这真是浪费。
答案 1 :(得分:0)
因为我找不到任何证据sf::UdpSocket::Send
&amp; sf::UdpSocket::receive
是线程安全的,我认为它们不是。