5

考虑以下情况:

  • 2个不同的网络端口,boost::asio每个端口都在自己的线程中
  • 1 个端口正在接收和处理数据 -class DataConnection包裹在std::thread
  • 1 个端口用于发送统计信息class StatConnection,也包含在std::thread

为了计算连接(和其他小数据块),我的想法是在类似的static内部使用一个变量namespace

#include <atomic>

namespace app {
 namespace status {
   static std::atomic<long> counter = 0; 
 }
}

DataConnection这对班级来说很好。在这里,我counter在 c'tor 中递增并查看值递增。

counter在我的StatConnection课上总是0

为什么会发生这种情况?

我尝试了一些替代方案:

  • 交换std::atomic<long>static volatile long没有任何区别。
  • 使用没有static关键字的命名空间。

然后我得到链接器错误:

multiple definition of `app::status::searchtime'
./src/status/Status.o:/[...]/include/status/Status.hpp:16: first defined here
[...]

那么为什么线程之间的值count不同呢?

4

1 回答 1

10

static在命名空间范围内引入了内部链接,因此每个翻译单元都有自己的副本counter——这与您真正想要的完全相反!

extern改为在标题中使用:

//foo.h:
#include <atomic>

namespace app {
    namespace status {
        extern std::atomic<long> counter;
    }
}

然后在一个翻译单元中定义变量:

//foo.cpp:
#include "foo.h"

namespace app {
    namespace status {
        std::atomic<long> counter{0L};
    }
}
于 2012-06-26T23:50:25.103 回答