其他
线程间到底共享了哪些进程资源?
记住了不一定真懂
逆向思考
线程私有资源
代码区
数据区
char c; // 全局变量
void func() {
}
void func(){
static int a = 10;
}
堆区
栈区
修改线程私有数据
void thread(void* var) {
int* p = (int*)var;
*p = 2;
}
int main() {
int a = 1;
pthread_t tid;
pthread_create(&tid, NULL, thread, (void*)&a);
return 0;
}
动态链接库
文件
One More Thing:TLS
存放在该区域中的变量是全局变量,所有线程都可以访问
虽然看上去所有线程访问的都是同一个变量,但该全局变量独属于一个线程,一个线程对此变量的修改对其他线程不可见。
int a = 1; // 全局变量
void print_a() {
cout<<a<<endl;
}
void run() {
++a;
print_a();
}
void main() {
thread t1(run);
t1.join();
thread t2(run);
t2.join();
}
首先我们创建了一个全局变量a,初始值为1 其次我们创建了两个线程,每个线程对变量a加1 线程的join函数表示该线程运行完毕后才继续运行接下来的代码
2
3
__thread int a = 1; // 线程局部存储
2
2
总结
往期精选