考虑以下szenario:
boost::asio
class DataConnection
包含在std::thread
class StatConnection
std::thread
为计算连接数(以及其他小数据),我的想法是在static
内使用namespace
变量,如:
#include <atomic>
namespace app {
namespace status {
static std::atomic<long> counter = 0;
}
}
这适用于DataConnection
类。在这里,我在c'tor中增加counter
并查看值增量。
但我的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
的值不同?
答案 0 :(得分:9)
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};
}
}