传递易失性 std 时出错::队列<int>丢弃限定符 [-允许] C++98



我有一个

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队列实例上使用它们。基本上,如果你必须有一些易失性的东西,那么这不是你要找的数据结构。

最新更新