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::send
和sf::UdpSocket::receive
方法同时使用会不会有什么意想不到的效果?
如果是这样,我宁愿:
- 有一个在执行上述命名方法之前被锁定的互斥体?
- 有第二个用于发送的套接字吗?
因为我找不到任何证据表明 sf::UdpSocket::Send
和 sf::UdpSocket::receive
是线程安全的,所以我认为它们不是。
我无法回答您正在使用的包,但在操作系统级别,这些方法是原子的,因此是线程安全的。您可以同时从多个线程调用它们。同时发送和接收将独立进行;同时发送将以某种未定义的顺序自动发生;同时接收也将以某种未定义的顺序自动发生。
除非该包具有严重的实现特性,否则我希望它也是线程安全的:没有内在原因不能做到这一点。您当然不需要单独的套接字来发送和接收。这太浪费了。
我有一个 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::send
和sf::UdpSocket::receive
方法同时使用会不会有什么意想不到的效果?
如果是这样,我宁愿:
- 有一个在执行上述命名方法之前被锁定的互斥体?
- 有第二个用于发送的套接字吗?
因为我找不到任何证据表明 sf::UdpSocket::Send
和 sf::UdpSocket::receive
是线程安全的,所以我认为它们不是。
我无法回答您正在使用的包,但在操作系统级别,这些方法是原子的,因此是线程安全的。您可以同时从多个线程调用它们。同时发送和接收将独立进行;同时发送将以某种未定义的顺序自动发生;同时接收也将以某种未定义的顺序自动发生。
除非该包具有严重的实现特性,否则我希望它也是线程安全的:没有内在原因不能做到这一点。您当然不需要单独的套接字来发送和接收。这太浪费了。