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里的一个问题相关推荐

  1. windows程序设计(第2版 王艳平)学习记要:3.2 线程同步

    线程同步的主要问题,在于需要解决不止一个线程同时执行某一段代码,访问同一个内存中的数据,临界区对象就是为了解决这个问题,它是一个CRITICAL_SECYION结构,被windows内部使用这个结构记 ...

  2. windows程序设计 Charles Petzold VS 王艳平

    王艳平的的<windows程序设计>和外国的重复吗,看哪个好啊? Charles Petzold的那本比较侧重于应用,比较全面的介绍了win32编程 但个人 感觉深度不够,很多东西只是点到 ...

  3. 何钦铭c语言程序设计第八章,c语言程序设计(第3版)何钦铭-颜-晖-第8章--指针

    1.第8章 指针[练习8-1]如果有定义"int m, n = 5, *p = &m;"与m = n等价的语句是 B .A m = *p; B. *p = *&n; ...

  4. 何钦铭c语言程序设计第八章,C语言程序设计(第3版)何钦铭颜晖第8章指针

    <C语言程序设计(第3版)何钦铭颜晖第8章指针>由会员分享,可在线阅读,更多相关<C语言程序设计(第3版)何钦铭颜晖第8章指针(16页珍藏版)>请在人人文库网上搜索. 1.第8 ...

  5. Windows程序设计第五版源代码---LINEDEMO

    源代码如下: #include <windows.h>LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);int WINAPI Win ...

  6. C语言程序设计第五版谭浩强课后答案 第六章《利用数组处理批量数据》习题答案 (大一大二、考研、计算机二级必看)

    第六章<利用数组处理批量数据>习题答案 1. 用筛选法求100之内的素数 2. 用选择法对10个整数排序 3. 求一个3 X 3的整形矩阵对角线元素之和 4. 有一个已经排好序的数组,要求 ...

  7. 何钦铭c语言第三版第9章答案,c语言程序设计第3版何钦铭 颜 晖 第9章 结构.pdf...

    第 9 章 结构 [练习9-1]定义一个能够表示复数的结构类型,一个复数包括实数与虚数两个 部分. 解答: struct complex{ float real; float imaginary; } ...

  8. java程序设计第三版课后答案张思民

    前言 面试技巧另外开篇再说,先上面试干货吧.面试的题目并不一定有严格的顺序关系,有的是从前一个问题延伸而来,(探究的是一个知识的深度),有的是考察面试者的知识广度.有的纯粹是我想到哪里写到哪里的啦.. ...

  9. [书籍推荐]《软件设计精要与模式(第2版)》-张逸——提高设计模式及软件设计的方法...

    <软件设计精要与模式(第2版)>是园子里张逸大大今年4月出版的关于软件设计及设计模式方面的书,我是5月下旬到手,每天晚上看一章,断断续续的到昨天晚上总算把全书28章看完了,感受很深,以往在 ...

最新文章

  1. 2021年春季学期-信号与系统-第二次作业参考答案-第十小题
  2. 【视频开发】图像清晰度评价方法
  3. 线程高级应用-心得9-空中网的三道面试题,考察应试者的线程掌握的深度
  4. MapReduce:处理数据密集型文本处理–局部聚合第二部分
  5. 奇奇seo优化软件_西藏seo关键词优化软件
  6. 天池 在线编程 所有子数组之和(排列组合)
  7. 资源:代码舞动动画 提供gif图片(含程序、源码、下载地址)
  8. Java服务端向客户端写文件_java实现客户端向服务器发送文件
  9. 船员英语老师是面试还是计算机答题,面试时的英语介绍
  10. 在组织中管理 Windows Hello 企业版
  11. React性能优化总结
  12. c语言编写烟花程序,C语言烟花程序
  13. c语言for语句用法和例子
  14. rs485与modbus流程图_RS485通讯基础及通讯应用详解
  15. 推荐两本 Spark 好书
  16. 细胞穿膜肽TAT/血管肽Angiopep/靶向多肽cRGD偶联TIO2二氧化钛纳米粒(TiO2-Angiopep)
  17. 期货交易结算信息(期货结算系统)
  18. 运维 技术支持 人在香港 硬件维护 经验
  19. 计算机基础知识---位运算的应用
  20. 对高数值孔径显微镜下不同样品研究

热门文章

  1. hmi服务器在宽限期下运行,hmi服务器具体有哪些作用
  2. linux修改密码和宽限天数,Linux用户和组管理
  3. 使用qt在windows的vs下写串口助手
  4. 分享QQ、微信 好友 ,空间、 新浪 的三种方式(验证通过)
  5. nand flash换nor flash ubi换squashfs
  6. CF 474E Pillars(线段树优化DP)
  7. 东西湖计算机补课班,东西湖区中考补习班怎么补救中考补习班可信吗
  8. android蓝牙 uuld,BLE4.0低功耗蓝牙协议总结
  9. 08.文件共享服务器
  10. 90天通过专利代理人考试的经验