多个线程间共享资源,一般可以通过加锁来避免发生竞态条件。然而这不是唯一一个需要在多线程时需要注意的问题,‘野指针’是另外一个必须注意的问题。 引用就是指针的语法糖,汇编完毕后的代码一样: C++代码: 38 int main() 39 { 40 int i = 0; 41 int * pi = &i; 42 int * pi2 = pi; 43 44 foo(pi); 45 int &ref_i = i; 46 foo(&ref_i); 47 48 return 0; 49 } 对应汇编结果: 0000000000400574 <main>: 400574: 55 push %rbp 400575: 48 89 e5 mov %rsp,%rbp 400578: 48 83 ec 20 sub $0x20,%rsp 40057c: c7 45 e4 00 00 00 00 movl $0x0,0xffffffffffffffe4(%rbp) 400583: 48 8d 45 e4 lea 0xffffffffffffffe4(%rbp),%rax 400587: 48 89 45 e8 mov %rax,0xffffffffffffffe8(%rbp) 40058b: 48 8b 45 e8 mov 0xffffffffffffffe8(%rbp),%rax 40058f: 48 89 45 f0 mov %rax,0xfffffffffffffff0(%rbp) 400593: 48 8b 7d e8 mov 0xffffffffffffffe8(%rbp),%rdi 400597: e8 ce ff ff ff callq 40056a <_Z3fooPi> 40059c: 48 8d 45 e4 lea 0xffffffffffffffe4(%rbp),%rax 4005a0: 48 89 45 f8 mov %rax,0xfffffffffffffff8(%rbp) 4005a4: 48 8b 7d f8 mov 0xfffffffffffffff8(%rbp),%rdi 4005a8: e8 bd ff ff ff callq 40056a <_Z3fooPi> 4005ad: b8 00 00 00 00 mov $0x0,%eax 4005b2: c9 leaveq 4005b3: c3 retq 4005b4: 90 nop