使用 std::atomic::atomic 时出现错误 C2248<bool>

error C2248 while using std::atomic<bool>::atomic

本文关键字:atomic gt lt C2248 bool std 使用 错误      更新时间:2023-10-16

首先,请原谅我的长文。

我使用boost::lockfree::spsc_queue在两个单独的线程上运行来处理FIX消息。我正在使用快速修复从文件转换FIX字符串转换为FIX消息。我希望能够将队列作为指针传递给线程和布尔值,指示是否仍有消息要处理。

我得到以下错误:

请参考下面的代码。

它基于boost文档中的一个示例。(Waitfree单生产者/单消费者队列)

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

我一直在尝试不同的方法来转移运行和pqFixMessages的值到两个线程,但没有接缝到现在的工作。如有任何建议,我将不胜感激。

'std::atomic<bool>::atomic' : cannot access private member declared in class 'std::atomic<bool>

描述:

生产者线程读取一个文件,创建FIX消息并将它们推入队列。

消费者线程读取队列并处理这些消息。到目前为止,我只是显示会话id用于调试。

Main有一个指向队列的指针,该指针传递给两个线程。

进一步的上下文:在此工作之后,我希望生产者和消费者是单独的类。

#include <iostream>
#include <thread>
#include <atomic>
#include <fstream>
#include <quickfixMessage.h>
#include <boostlockfreespsc_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是不可复制的

因此,不能将它们按值传递给函数。

这是有原因的。通常,尝试按值传递它们表示编程错误。它们通常被用作同步原语,您不能用副本同步任何内容。