【问题标题】:Problems with STL as a static volatile memberSTL 作为静态 volatile 成员的问题
【发布时间】:2011-01-27 02:51:59
【问题描述】:

我正在尝试编译这样的东西:


#include <list>

class thread
{
public:
 static volatile std::list<thread *> threadList;    //This is also protected by a mutex
};
volatile std::list<thread *> thread::threadList;

void main()
{
 thread A;
 thread::threadList.push_back(&A);
 thread::threadList.remove(&A);
}

我在尝试编译时遇到这些错误:


test.cpp(14): error C2663: 'std::list::push_back' : 2 overloads have no legal conversion for 'this' pointer
          with
          [
              _Ty=thread *
          ]
test.cpp(15): error C2662: 'std::list::remove' : cannot convert 'this' pointer from 'volatile std::list' to 'std::list &'
          with
          [
              _Ty=thread *
          ]
          Conversion loses qualifiers

我做错了什么?
编辑:用
修复了一些格式错误 EDIT2:threadList 受互斥体保护,为了简单起见,我没有把它放在这里

【问题讨论】:

  • 我打赌他想要一份他拥有的所有 c++0x 或 boost thread 的列表,并且他希望拥有它们的容器能够同步

标签: c++


【解决方案1】:

去除 volatile 并消除问题。因此,对于真正的答案,如果您解释为什么需要 volatile 以及它在这里的含义,可能会有所帮助。它不会使整个列表被视为 volatile。

另见previous answer

【讨论】:

  • 我正在使用 volatile,因为该列表将被多个线程使用。这段代码也被简化了;我的实际代码具有受互斥锁保护的列表。现在我想一想,在这种情况下,volatile 甚至会有所作为吗?
  • @Mark:不。如果你有锁,volatile 不需要简单的访问保护。
  • @Mark- Volatile 不会使 vector 线程安全。您需要使用显式锁。通常,volatile 的意思是“不要优化此值的读写,因为它可能会从其他空间更改”,而不是“防止多个线程接触此变量”。
  • 我也在列表中使用 volatile,因为我担心某些线程会更改它,但由于编译器过度优化,其他线程不会注意到更改
  • @Mark:这就是为什么你需要使用锁来同步对vector的访问。 volatile 不会做你认为的任何事情。你不能用它来保证多线程中的任何事情。
【解决方案2】:

首先,volatile 可能是最不为人所知的关键字,而且它很可能按照您的想法行事。我通过hard way 了解到这一点。

话虽如此,问题在于volatile 也可以用作函数的限定符,以确保在正确的上下文中调用它们。 push_back() 函数未使用 volatile 限定符声明,因此在 volatile 对象上调用它是无效的。非易失性成员函数只能为非易失性对象调用。

【讨论】:

    【解决方案3】:

    使用 g++ 编译得到

    test.cpp:13: 错误:传递‘volatile std::list >' 作为'this' 'void std::list<_tp _alloc>::push_back(const _Tp&) [with _Tp = thread*, _Alloc = std::allocator]’ 丢弃 限定词 ...

    discards qualifiers 是您的提示。函数 list::push_back 不能在 constvolatile 实例上调用。

    一种方法:

    • 将列表设为私有
    • 创建私有静态互斥体
    • 创建addremove 的静态公共函数
    • addremove 中获取锁,然后从列表中添加或删除

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-28
      • 1970-01-01
      • 2014-08-07
      • 2011-03-23
      • 1970-01-01
      • 2018-10-05
      • 1970-01-01
      相关资源
      最近更新 更多