b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

【c ++共享变量锁】

电脑杂谈  发布时间:2020-07-12 20:05:15  来源:网络整理

c++线程死锁_ccriticalsection 多线程 死锁_ccriticalsection 多线程 死锁

前面已经讨论了多个线程是否需要锁定同一变量的问题. 今天,我使用代码验证了先前的猜测: 32位CPU和内存之间的最小交换数据为4字节/次,这就是为什么结构应对齐为4字节的原因. 在物理上,对于相同的4字节存储单元,CPU不可能在读取3个字节的同时写入2个字节. 测试环境为: XEON 2CPU * 2Windows7使用50、50、50线程交叉读写ccriticalsection 多线程 死锁,测试代码如下:

C / C ++代码

int g_test; int temp; BOOL g_bRunning; DWORD WINAPI thWriteProc1(LPVOID lParam){while(g_bRunning){g_test = 12345678; Sleep(1);}返回0;} DWORD WINAPI thWriteProc2(LPVOID lParam){while(g_bR ){g_test = 13579246; Sleep(1);}返回0;} DWORD WINAPI thReadProc(LPVOID lParam)(while(g_bRunning)(temp = g_test; //如果(temp!= 12345678 && temp!= 13579246)则读取值g_bRunning = FALSE; CString str; str.Format(“ read error!%d”,temp); AfxMessageBox(str); break;} Sleep(1);}返回0;} void CTestMultiyAccessIntDlg :: OnButton1(){g_bRunning = TRUE;对于(int i = 0; i <50; i ++){//创建50个编写器线程1CreateThread(NULL,0,thWriteProc1,NULL,0,NULL);} for(int i = 0; i <50; i ++ } {//创建50个写线程2CreateThread(NULL,0,thWriteProc2,NULL,0,NULL);} for(int i = 0; i <50; i ++){//创建50个读线程CreateThread(NULL,0, thReadProc,NULL,0,NULL);}}

测试方法:

更改g_test的类型并为g_test分配不同的值(不要超过该类型的上限)

测试现象:

c++线程死锁_ccriticalsection 多线程 死锁_ccriticalsection 多线程 死锁

当g_test为int,短字符时,没有多线程交叉读写错误的问题

当g_test为double,float和__int64时,存在多线程交叉读取和写入错误的问题. 对于__int64,当分配小于0xFFFFFFFF时没有错误,而大于0xFFFFFFFF则没有错误

当g_test为CString时,存在交叉读写错误,有时程序会崩溃

另一个: 没有Sleep(1),机器被卡住,CPU占用率达到100%,四个核心占用率已满ccriticalsection 多线程 死锁,可以确保它在多核环境中运行

现象分析:

(1)int短字符是小于4个字节的连续存储块,CPU可以在一条指令中读取和写入它们的值,并且CPU无法同时执行两条指令

(2)double是8个字节,如果写入线程先写入4个字节,则读取线程将读取8个字节,这自然会导致数据损坏

ccriticalsection 多线程 死锁_ccriticalsection 多线程 死锁_c++线程死锁

(3)浮点数也是4个字节,我不知道为什么它不太好,也许是由于VC对浮点数的特殊处理,并且浮点数具有复杂的内存结构

(4)__ int64为8个字节,与(2)情况相同,如果__int64小于或等于0xFFFFFFFF,则等效于仅更改低4个字节,因此没有问题

(5)CString是一个类类型,具有复杂的结构,显然不起作用

结论:

1. 对于int,short,char,BOOL和小于或等于4个字节的简单数据类型,如果没有逻辑序列,则多线程读写可以完全没有锁.

2. 尽管浮点数为4个字节,但多线程访问也需要锁定

3. 对于大于4个字节的简单类型,例如double,__ int64等,必须锁定多线程读写.

ccriticalsection 多线程 死锁_c++线程死锁_ccriticalsection 多线程 死锁

4. 对于所有复杂类型,例如类,结构,容器和其他类型,都必须锁定

尽管不必锁定诸如int之类的多线程读写,但从逻辑上讲,必须锁定该锁.

例如: 对于多线程全局变量int g_test

int计数= g_test / 1024;

int mod = g_test24;

因为它是两个语句,所以在执行第一个语句之后,其他线程可能已经修改了g_test的值. 如果要执行这两个语句,g_test不会改变,则必须锁定以确保两个语句的执行完整性.

Lock();

c++线程死锁_ccriticalsection 多线程 死锁_ccriticalsection 多线程 死锁

int计数= g_test / 1024;

int mod = g_test24;

UnLock();

如果您不锁定它,则可以将其保存到一个临时变量中.

int temp = g_test;

int count = temp / 1024;

int mod = temp24;


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-278020-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...