参考:
https://www.cnblogs.com/zhouyazhou/p/7748069.html
说明:
(1)int short char均为小于4字节的连续内存块,CPU一条指令就可以读写它们的值,CPU不可能同一个时间执行两条指令;
(2)double为8字节,如果写线程先写了4字节,读线程读了8字节,这自然导致数据被破坏;
(3)float也为4字节,我也不是太清楚为什么不行,可能是VC对浮点数的处理比较特殊有关,浮点数具有复杂内存结构;
(4)__int64为8字节,存在和(2)相同的情况,如果__int64小于等于0xFFFFFFFF,相当于只改变了低4字节,因此就没有问题;
(5)CString为类类型,具有复杂结构,显然不行;
结论:
1.对于int,short,char,BOOL等小于等于4字节的简单数据类型,如果无逻辑上的先后关系,多线程读写可以完全不用加锁;
2.尽管float为4字节,多线程访问时也需要加锁;
3.对于大于4字节的简单类型,比如double,__int64等,多线程读写必须加锁;
4.对于所有复杂类型,比如类,结构体,容器等类型必须加锁;
尽管对int等类型的多线程读写不需要加锁,但是逻辑上有必要加锁的还是应该加锁;
例如:对于一个多线程访问的全局变量int g_test;
int count = g_test/1024;
int mod = g_test%1024;
由于是两条语句,执行完第一条之后,别的线程很可能已经修改了g_test的值,如果希望这两条语句执行时,g_test不发生变化,就必须加锁,以保证两条语句执行的整体性;
Lock();
int count = g_test/1024;
int mod= g_test%1024;
UnLock();
如果不加锁,也可以改为先保存到一个临时变量里;
int temp = g_test;
int count = temp/1024;
int mod = temp%1024;