我正在用 C++11 实现一个多线程应用程序,它使用一个线程来轮询来自 QUdpSocket(QT5 框架)的数据,并使用另一个线程来处理收集的数据。
当套接字检测到传入数据时,ReadyRead()
会发出一个信号,并将所有数据报从 a 中提取QUdpSocket
并复制到 astd::list
中。
void SocketWrapper::QueuePendingDatagrams()
{
while (hasPendingDatagrams()) {
int dataSize = pendingDatagramSize();
QByteArray tmpQByte = receiveDatagram().data();
datagramList.push_back(tmpQByte); // see const_data
}
emit newDatagrams(&datagramList);
}
然后在另一个线程中,启动消费者并检索列表的第一个元素,直到列表为空。
void Worker::ProcessDatagrams(std::list<QByteArray>* pDatagramList)
{
while (pDatagramList->size() > 0) {
QByteArray tmpDatagram = pDatagramList->front();
pDatagramList->pop_front();
// Process and log the data within the datagram...
}
我的问题是:由于我总是弹出第一个元素并在最后一个元素之后推送,这种无锁方法是线程安全的吗?
在数据处理过程中,我可能(并且将)接收到更多数据到套接字,因此两个线程最终将同时运行。对我来说,似乎唯一可能发生的数据竞争可能会高估DatagramList->size()
,但我不明白为什么会出现问题。如果我不断接收数据,我相信无论如何都会消耗整个列表。