У меня есть приложение, которое будет принимать данные со скоростью до ~50 МБ/с. Моя текущая настройка состоит в том, чтобы один поток получал данные из сети и помещал их в QQueue, расположенный в другом потоке. Затем эта очередь QQueue очищается в файл. Кажется, эта настройка хорошо работает на четырехъядерном процессоре i7 с тактовой частотой 2,5 ГГц, но не на Xeon с тактовой частотой 1,8 ГГц и 8 ядрами. Оба имеют одинаковый объем оперативной памяти. Проблема Xeon заключается в потере данных между передачей данных по сети и записью в файл. Я прекрасно понимаю, что потеря данных связана с моей способностью получать данные из сети. Мне нужно использовать QUdpSocket для получения данных, и важно, чтобы я получал все данные, но не обязательно по порядку. Есть ли у кого-нибудь идеи, как повысить производительность одного потока, что, как я подозреваю, является проблемой?
void ReceiveThread::readPendingDatagrams() {
// Process data while socket still has pending datagrams
while( udpReceiveSocket->hasPendingDatagrams() ) {
data = new QByteArray;
// Update the size
size = udpReceiveSocket->pendingDatagramSize();
// Reserve the size in the byte array
data->reserve( size );
// Store data into qbytearray
udpReceiveSocket->readDatagram( data->data(), size, &sender,
&senderPort );
// Send the data to the file thread
fileWriteThread.addPacketToQueue( data );
}
}
void FileWriteThread::addPacketToQueue(QByteArray * data) {
// Lock the mutex
QMutexLocker locker(&mutex);
// Add the data packet to the queue
dataQueue.enqueue( data );
numReceieved++;
locker.unlock();
// Wake the thread that is waiting for this
dataAdded.wakeOne();
}
void FileWriteThread::run() {
forever {
// Lock the mutex
QMutexLocker locker(&mutex);
// Check if the packet queue is empty
while( dataQueue.isEmpty() ) {
// Sleep the thread
dataAdded.wait(&mutex);
}
// Get the data from the queue
data = dataQueue.dequeue();
locker.unlock();
// Write the data to the file
writeDataToBuffer(data);
}
}
Подробнее здесь: https://stackoverflow.com/questions/224 ... ging-in-qt