使用 std::atomic::atomic 时出现错误 C2248<bool>
error C2248 while using std::atomic<bool>::atomic
首先,请原谅我的长文。
我使用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
是不可复制的
因此,不能将它们按值传递给函数。
这是有原因的。通常,尝试按值传递它们表示编程错误。它们通常被用作同步原语,您不能用副本同步任何内容。
相关文章:
- 如何从 std::atomic 中提取指针 T<T>?
- std::atomic和std::condition_variable wait,notify_*方法之间的区别
- std::memory_order for std::atomic:<T>:wait
- EASTL矢量<向量<int>>连续的
- MESI协议和std::atomic-它是否确保所有写入立即对其他线程可见?
- 在 lambda 表达式中使用 std::atomic
- C++std::atomic在程序员级别保证了什么
- 如果在 2 个线程中使用,是否值得将size_t声明为 std::atomic?
- MyType 允许 std::atomic 的确切要求是什么<MyType>?
- 无法将类型"T&"的非常量左值引用绑定到类型"T"的右值 t++ std::atomic<T>
- gcc Atomic在gcc 4.1.1中内置了奇怪的行为
- 在 C++20 之前和之后初始化 std::atomic
- Red Hat:使用<atomic>编译很好,但链接器找不到__atomic_store_16;什么库?
- std::atomic 和 std::mutex 的相对性能
- 使用用户定义的类型 UDT 实例化 std::atomic<>。如果 UDT 具有虚函数,则 l 墨水将失败。为什么?
- 简单使用 std::atomic 在两个线程之间共享数据
- Port pthread_cond_broadcast to std::atomic
- std::atomic中的任何内容都是免费等待的
- 对于 CPU 无法原子操作的类型,std::atomic 有什么意义?
- 在 atomic() 中 ++、add operation 和 fetch_add() 有什么区别