关于《Windows程序设计(第2版)王艳平 张铮编著》第3章设计TLS里的一个问题
2019独角兽企业重金招聘Python工程师标准>>>
如摘要所述,经过断点后发现如下代码有问题:
CNoTrackObject* CThreadLocalObject::GetData(CNoTrackObject* (*pfnCreateObject)())
{if (m_nSlot == 0) {if (_afxThreadData == nullptr) {_afxThreadData = new (__afxThreadData) CThreadSlotData;//OutputDebugString(_T("New CThreadSlotData\n"));}m_nSlot = _afxThreadData->AllocSlot();}// ...
}
这里面_afxThreadData的new执行了多次,很明显是由于多个线程在上一行if判断_afxThreadData为nullptr后即被挂起,之后被调度执行时,出现这种情形:一个线程的AllocSlot已经调用过了,另一个线程跑过来将_afxThreadData又new了一遍,抹掉了之前AllocSlot里面做的各种关键操作,状态彻底混乱了。 于是,我尝试在afxtls.cpp里写了下面一个类来做这里的new操作:
class CTlsInitializer
{
public:CTlsInitializer() {if (_afxThreadData == nullptr) {_afxThreadData = new (__afxThreadData) CThreadSlotData;}}
};
CTlsInitializer gInitializer;
实践证明结果正确了,之后无论怎么运行程序都是正确的结果,release和debug都不崩溃。 后来想了想,其实只要这段new能无竞争的跑一遍,以后就不会有问题了,像上面单独弄一个CTlsInitializer gInitializer;
虽然也可以,但其实只要在主线程里调用一下CThreadLocal的GetData函数,即可达到同样的目的。
CThreadLocal<MyThreadData1> g_myThreadData1;
CThreadLocal<MyThreadData2> g_myThreadData2;
// ...
int main() {//g_myThreadData1.operator->();(MyThreadData1*)g_myThreadData1; // 与上一行等价. 不用所有的CThreadLocal对象都做这个操作,只要任意一个即可。return 0;
}
运行效果和上面一样,也是正确的。不过从实用的角度,还是CTlsInitializer gInitializer;
为好。
转载于:https://my.oschina.net/zhoubaojing/blog/715526
关于《Windows程序设计(第2版)王艳平 张铮编著》第3章设计TLS里的一个问题相关推荐
- windows程序设计(第2版 王艳平)学习记要:3.2 线程同步
线程同步的主要问题,在于需要解决不止一个线程同时执行某一段代码,访问同一个内存中的数据,临界区对象就是为了解决这个问题,它是一个CRITICAL_SECYION结构,被windows内部使用这个结构记 ...
- windows程序设计 Charles Petzold VS 王艳平
王艳平的的<windows程序设计>和外国的重复吗,看哪个好啊? Charles Petzold的那本比较侧重于应用,比较全面的介绍了win32编程 但个人 感觉深度不够,很多东西只是点到 ...
- 何钦铭c语言程序设计第八章,c语言程序设计(第3版)何钦铭-颜-晖-第8章--指针
1.第8章 指针[练习8-1]如果有定义"int m, n = 5, *p = &m;"与m = n等价的语句是 B .A m = *p; B. *p = *&n; ...
- 何钦铭c语言程序设计第八章,C语言程序设计(第3版)何钦铭颜晖第8章指针
<C语言程序设计(第3版)何钦铭颜晖第8章指针>由会员分享,可在线阅读,更多相关<C语言程序设计(第3版)何钦铭颜晖第8章指针(16页珍藏版)>请在人人文库网上搜索. 1.第8 ...
- Windows程序设计第五版源代码---LINEDEMO
源代码如下: #include <windows.h>LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);int WINAPI Win ...
- C语言程序设计第五版谭浩强课后答案 第六章《利用数组处理批量数据》习题答案 (大一大二、考研、计算机二级必看)
第六章<利用数组处理批量数据>习题答案 1. 用筛选法求100之内的素数 2. 用选择法对10个整数排序 3. 求一个3 X 3的整形矩阵对角线元素之和 4. 有一个已经排好序的数组,要求 ...
- 何钦铭c语言第三版第9章答案,c语言程序设计第3版何钦铭 颜 晖 第9章 结构.pdf...
第 9 章 结构 [练习9-1]定义一个能够表示复数的结构类型,一个复数包括实数与虚数两个 部分. 解答: struct complex{ float real; float imaginary; } ...
- java程序设计第三版课后答案张思民
前言 面试技巧另外开篇再说,先上面试干货吧.面试的题目并不一定有严格的顺序关系,有的是从前一个问题延伸而来,(探究的是一个知识的深度),有的是考察面试者的知识广度.有的纯粹是我想到哪里写到哪里的啦.. ...
- [书籍推荐]《软件设计精要与模式(第2版)》-张逸——提高设计模式及软件设计的方法...
<软件设计精要与模式(第2版)>是园子里张逸大大今年4月出版的关于软件设计及设计模式方面的书,我是5月下旬到手,每天晚上看一章,断断续续的到昨天晚上总算把全书28章看完了,感受很深,以往在 ...
最新文章
- 2021年春季学期-信号与系统-第二次作业参考答案-第十小题
- 【视频开发】图像清晰度评价方法
- 线程高级应用-心得9-空中网的三道面试题,考察应试者的线程掌握的深度
- MapReduce:处理数据密集型文本处理–局部聚合第二部分
- 奇奇seo优化软件_西藏seo关键词优化软件
- 天池 在线编程 所有子数组之和(排列组合)
- 资源:代码舞动动画 提供gif图片(含程序、源码、下载地址)
- Java服务端向客户端写文件_java实现客户端向服务器发送文件
- 船员英语老师是面试还是计算机答题,面试时的英语介绍
- 在组织中管理 Windows Hello 企业版
- React性能优化总结
- c语言编写烟花程序,C语言烟花程序
- c语言for语句用法和例子
- rs485与modbus流程图_RS485通讯基础及通讯应用详解
- 推荐两本 Spark 好书
- 细胞穿膜肽TAT/血管肽Angiopep/靶向多肽cRGD偶联TIO2二氧化钛纳米粒(TiO2-Angiopep)
- 期货交易结算信息(期货结算系统)
- 运维 技术支持 人在香港 硬件维护 经验
- 计算机基础知识---位运算的应用
- 对高数值孔径显微镜下不同样品研究