gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 05:57:31 25 4
gpt4 key购买 nike

我有一个运行 std::thread 的 NetworkDevice 类对所有传入的数据包进行排队。在执行此操作时,我还想在相同的 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方法同时起作用?

如果是这样,我宁愿:

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

最佳答案

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

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

关于c++ - sf::UdpSocket 的发送和接收方法是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33855199/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com