当前位置: 首页 > news >正文

华为面试题3

这是一道中级题. 高级题其实还不如这道题

1) 指出以下示意代码的错误之处

CRITICAL_SECTION g_CriticalSection=NULL;
char *g_string=NULL;

class MyClass
{
public:
int InitInstance();
int threadA();
};

int MyClass::Init()
{
InitCriticalSection(&g_CriticalSection);
CreateThread(threadA,...);
}

int MyClass::threadA()
{
EnterCriticalSection(g_CriticalSection)
if(g_string!=NULL)
{
delete g_string;
}
g_string = new char[1024];
...
delete g_string;
g_string = NULL;
ExitCriticalSection(g_CriticalSection)
return 0;
}

2) 如果MyClass改成如下定义,请写出实现上面功能的代码

class MyClass
{
static const CRITICAL_SECTION m_CriticalSection;
public:
MyClass() { EnterCriticalSection(m_CriticalSection); }
~MyClass(){ ExitCriticalSection(m_CriticalSection); }
};
(1)我随便说说看1.gif 我想问题应该在下面这里
int MyClass::Init()
{
InitCriticalSection(&g_CriticalSection);
CreateThread(threadA,...);
}

从代码来看,声明一个MyClass后,应该先调用Init()来初始化,问题就在初始化里面。千不该万不该,不该把临界区的初始化放在类的构造函数里面,这样一来,每初始化一个对象,就要把代表临界资源的变量给初始化一遍,如果这之前已经有对象进入了临界区,那么冲突是不可避免的了。要避免这种情况,最基本的办法就是把临界区的初始化放在一个全局的位置,毕竟临界区变量也是一个全局变量。

(2)如果要2)的要求实现的话
不知道这样行不行:
class MyClass
{
static const CRITICAL_SECTION m_CriticalSection;
public:
MyClass() { EnterCriticalSection(m_CriticalSection); }
~MyClass(){ ExitCriticalSection(m_CriticalSection); }
int threadA();
int Init();
};
int MyClass::Init()
{
CreateThread(threadA,...);
}

int MyClass::threadA()
{
if(g_string!=NULL)
{
delete g_string;
}
g_string = new char[1024];
...
delete g_string;
g_string = NULL;
return 0;
}

int InitCriticalSection(CRITICAL_SECTION* CriticalSection)
{
.............
};

开始时,先调用
InitCriticalSection(&MyClass.m_CriticalSection);
然后再使用MyClass对象

感觉应该是这样吧1.gif

相关文章:

  • golang多个消费者访问共享数据
  • 创建第一个区块001
  • c语言常见出错信息(转)
  • 创建我的第一个区块链002
  • 几种开发工具的特性比较(转载)
  • 添加区块到区块链当中003
  • 很难见得到的一篇关于windows进程的说明书(转载)
  • 补充区块代码更新函数004
  • byte二位数组转换问题005
  • 写在周日的凌晨( 一次思维的对话)
  • 挖矿初出茅庐006
  • blot数据库007
  • Chapter1:Oracle 10g Oracle DAB [Oracle® Database 2 Day DBA
  • 修改构造区块链数据库008
  • golang序列化与反序列化009
  • Google 是如何开发 Web 框架的
  • 2017 前端面试准备 - 收藏集 - 掘金
  • ES6 ...操作符
  • Java读取Properties文件的六种方法
  • js如何打印object对象
  • ViewService——一种保证客户端与服务端同步的方法
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • Web设计流程优化:网页效果图设计新思路
  • 成为一名优秀的Developer的书单
  • 多线程 start 和 run 方法到底有什么区别?
  • 面试总结JavaScript篇
  • 前端_面试
  • 使用docker-compose进行多节点部署
  • 树莓派 - 使用须知
  • 算法-插入排序
  • 微信小程序填坑清单
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • $.ajax()方法详解
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (Java)【深基9.例1】选举学生会
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (附源码)ssm失物招领系统 毕业设计 182317
  • (离散数学)逻辑连接词
  • (三)mysql_MYSQL(三)
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (算法)求1到1亿间的质数或素数
  • (算法设计与分析)第一章算法概述-习题
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • (转)为C# Windows服务添加安装程序
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • .[hudsonL@cock.li].mkp勒索加密数据库完美恢复---惜分飞
  • .net中的Queue和Stack
  • .net中应用SQL缓存(实例使用)
  • @ 代码随想录算法训练营第8周(C语言)|Day53(动态规划)
  • [BUG]Datax写入数据到psql报不能序列化特殊字符
  • [C++从入门到精通] 14.虚函数、纯虚函数和虚析构(virtual)
  • [IM] [Webhook] Webhook实现IM平台机器人
  • [jQuery]div滚动条回到最底部