问题描述
使用一个全局变量测试多线程同时访问一个变量的性能,结果却报错了
多重定义了,于是顺藤摸瓜,找到了变量thread_index
的位置
// MyThread.h
int thread_index = 0;
以及使用这个变量的地方——
// Source.cpp
#include"MyThread.h"
...
int main(){
...
thread_index++;
...
}
原来是全局变量的使用方式错了。在创建thread_index
变量的时候,使用int thread_index = 0
声明并初始化,其实是声明+定义 两个过程。然后再使用#include
预编译指令扩展到其他文件,实际上相当于多处定义了。
问题解决方案
解决这个问题有两个方法——
- 使用
extern
关键字,正确使用全局变量的外部引用 - 使用
static
关键字
第一种方法
在头文件中声明该变量时,加上 extern
关键字,表明该变量具有 外部链接性
//MyThread.h
extern int thread_index;
然后在任意cpp文件中定义该变量
//MyThread.cpp
int thread_index = 0;
最后通过#include
预编译指令或者直接使用声明该变量的方式在目标代码块中使用:
//Source.cpp
#include"MyThread.h"
// 或者 extern int thread_index;
...
int main(){
...
thread_index++;
...
}
问题解决。
第二种方法
// MyThread.h
static int thread_index = 0;
可以直接在目标代码块中使用。但要注意的是,这与第一种方法的作用是完全不同的,static
限定了全局变量的链接性为文件内部链接性,即该全局变量只在本文件内有效,然后通过#include
使用该变量时,会将多个static
全局变量复制到不同的文件中,彼此相互独立,因此不会造成二义性,但同时该变量本质上已经失去全局变量的意义。
参考链接
全局变量引起的LNK2005 https://blog.csdn.net/zwlhoho/article/details/50571275
static 关键字的总结 https://www.cnblogs.com/33debug/p/7223869.html