Во-первых, простите меня за длинный пост.
Я использую boost :: lockfree :: spsc_queue для запуска в двух отдельных потоках для обработки сообщений FIX. Я использую QuickFix для преобразования строк FIX из файла для преобразования в сообщения FIX. Я хочу иметь возможность передавать очередь как указатель на оба потока и логическое значение, которое указывает, есть ли еще сообщения для процессов.
Я получаю следующую ошибку:
Пожалуйста, ознакомьтесь с кодом ниже.
Это основано на примере в документации повышения. (Waitfree Single-Produce / Single-Consumer Queue)
http://www.boost.org/doc/libs/1_55_0/doc/html/lockfree/examples.html
Я пробовал разные способы передачи значения running и pqFixMessages двум потокам, но на данный момент ничего не работает. Буду признателен за любые предложения.
'std::atomic<bool>::atomic' : cannot access private member declared in class 'std::atomic<bool>
Описание:
Поток продюсера читает файл, создает сообщения FIX и помещает их в очередь.
Поток потребителя читает очередь и обрабатывает эти сообщения. На данный момент я просто показываю идентификаторы сессии для отладки.
Main имеет указатель на очередь, которая передается обоим потокам.
Дальнейший контекст: после этого я хочу, чтобы производитель и потребитель были отдельными классами.
#include <iostream>
#include <thread>
#include <atomic>
#include <fstream>
#include <quickfix\Message.h>
#include <boost\lockfree\spsc_queue.hpp>using namespace std;
using namespace boost::lockfree;
void producer(spsc_queue<FIX::Message, capacity<1024>> * pqFixMessages, std::atomic<bool> running) {
std::string line;
std::ifstream fixMessageStream(<filename>);
FIX::Message currentMessage;
while (fixMessageStream) {
std::getline(fixMessageStream, line);
try {
// Erases the timestamp on messages
currentMessage = FIX::Message(line.erase(0, 25));
pqFixMessages->push(currentMessage);
} catch (std::exception& ex) {
}
}
running = false;
}
std::atomic<bool> done(false);
void consumer(spsc_queue<FIX::Message, capacity<1024>> * pqFixMessages, std::atomic<bool> running) {
FIX::Message frontOfTheQueueMessage;
while(!pqFixMessages->empty() || running) {
if (!pqFixMessages->empty()) {
pqFixMessages->pop(frontOfTheQueueMessage);
cout << frontOfTheQueueMessage.getSessionID() << endl;
}
}
}
int main(int argc, char * argv[]) {
spsc_queue<FIX::Message, capacity<1024>> * pqFixMessages =
new spsc_queue<FIX::Message, capacity<1024>>();
std::atomic<bool> running(true);
thread producerThread(producer, pqFixMessages, ref(running));
cout << "Entered Producer Thread" << endl;
thread consumerThread(consumer, pqFixMessages, ref(running));
cout << "Entered Consumer Thread" << endl;
producerThread.join();
cout << "Joined Producer Thread" << endl;
done = true;
consumerThread.join();
cout << "Joined Consumer Thread" << endl;
delete pqFixMessages;
std::cin.get();
return 0;
}
std::atomic
С не могут быть скопированы.
Следовательно, передача их по значению в функцию невозможна.
Это по причине. Обычно попытка передать их по значению указывает на ошибку программирования. Обычно они используются в качестве примитивов синхронизации, и вы ничего не можете синхронизировать с копией.