我有一个
volatile std::queue<int> requestQueue;
和当我尝试在函数内调用它的任何方法(pop, push, empty, front等)时,例如:
while (!requestQueue.empty()){
...do something
}
我得到以下错误:
robot.cpp:43:31: error: passing 'volatile std::queue<int>' as 'this'
argument of 'bool std::queue<_Tp, _Sequence>::empty()
const [with _Tp = int, _Sequence = std::deque<int, std::allocator<int> >]'
discards qualifiers [-fpermissive]
我在网上发现可能需要类型转换,但我不确定情况是否如此。
任何想法?提前谢谢。
1)程序使用这样的数据结构来存储请求序列,以便服务器可以以自己的服务速率接收请求。
2) volatile用于支持运行在不同内核上的函数之间的数据共享。
关于 的使用,我使用的库的文档说明如下- 使用static volatile声明全局变量,以便在不同内核中运行的函数之间共享。
你期望volatile
创造不可能的奇迹。原因很简单,std::queue
不是线程安全队列,也不是可等待队列。如果你想的话,你可以创建一个线程安全的、可等待的队列,但是仅仅把volatile
附加到std::queue
上并不能神奇地变出必要的代码来做这件事。
这是一个关于volatile
的常见误解。在某些情况下,在某些平台上,它恰好做了你碰巧需要的事情,让一些东西在核心之间工作。但这总是偶然和运气的结合。在C或c++中,这几乎从来都不是跨内核同步的正确方法。
我怀疑你真正的问题是,"我如何在c++中创建一个线程安全的可等待队列?"答案是使用std::mutex
使其线程安全,使用std::condition_variable
使其可等待。这些东西使用起来并不简单,而且需要一些专业知识,所以您可能更愿意找到一个已经写好的合适的队列。
如果你的代码不是c++ 11,那么我们需要知道你是如何创建线程来知道你应该如何同步它们。Windows线程有方法,POSIX线程也有方法。如果这不是线程(可能是进程共享内存或类似的东西),那么std::queue
甚至不接近你需要的——它不可能工作,因为std::queue
在内部使用指针,而这些指针不能跨进程工作。
队列成员函数不是volatile限定的,因此不能在volatile队列实例上使用它们。基本上,如果你必须有一些易失性的东西,那么这不是你要找的数据结构。