ошибка C2248 при использовании std :: atomic <bool> :: atomic

0

Во-первых, простите меня за длинный пост.

Я использую boost :: lockfree :: spsc_queue для запуска на двух отдельных потоках для обработки сообщений FIX. Я использую quickfix для преобразования строк FIX из файла для преобразования в сообщения FIX. Я хочу, чтобы передать очередь в качестве указателя на оба потока и логическое значение, которое указывает, есть ли еще сообщения для процессов.

Я получаю следующую ошибку:

Пожалуйста, ознакомьтесь с приведенным ниже кодом.

Он основан на примере в дополнительной документации. (Одиночный продюсер Waitfree/Одиночный потребитель)

http://www.boost.org/doc/libs/1_55_0/doc/html/lockfree/examples.html

Я пытаюсь по-разному передавать значение run и 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;

}

Теги:
multithreading
boost
fix

1 ответ

2
Лучший ответ

std::atomic не копируются.

Следовательно, передача их по значению в функцию невозможна.

Это по какой-то причине. Обычно попытка передать их по значению указывает на ошибку программирования. Они обычно используются в качестве примитивов синхронизации, и вы не можете синхронизировать что-либо с копией.

  • 0
    Ах понятно. Передача в качестве указателя сделала свое дело. Но все же хочу понять, что когда я передаю ссылку на него ManufacturerThread (provider, pqFixMessages, ref (running)); - создает ли он его копию или действует на тот же объект?
  • 0
    std::ref заботится только о том, чтобы не копировать объект при создании замыкания для потока. Функция, которая выполняет поток, по-прежнему не должна принимать его аргумент по значению, иначе вы скопируете его здесь при запуске потока. Только если у вас есть и параметр функции в качестве ссылки, и std::ref при создании потока, вы получите истинную передачу по ссылке.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню