当前位置:首页 >> 数学 >>

成员变量、局部变量、全局变量加锁问题


局部变量有自己的内存空间,相互直接是独立,互补干扰的,所以没必要加锁。 而对于成员变量, 和全局变量在只读不写的情况下也不要加锁。 假如有一个线程对成员变量 和全局变量进行写操作是就必须加锁。加锁是一个好习惯。 /// <summary> /// 取得线程数据包 /// </summary> /// <param name="cabinetNo">柜号</param> /// <param name="sideNo">面号</param> /// <param name="layerNo">层号</param> /// <returns>数据处理包</returns> /// <remarks>注意加锁,枚举元素的过程中,不可以对队列中元素进行增加或者删 除</remarks> internal StorageDataThreadFactory GetStroageDataPackage(int cabinetNo, int sideNo, int layerNo) { if (this.m_StoragehreadList == null || this.m_StoragehreadList.Count <= 0) return null; lock (m_StoragehreadList) { for (int i = 0; i < m_StoragehreadList.Count; i++) { if (m_StoragehreadList[i].CabinetNo == cabinetNo && m_StoragehreadList[i].SideNo == sideNo && m_StoragehreadList[i].LayerNo == layerNo) { return m_StoragehreadList[i]; } } } return null; } m_StoragehreadList 是一个成员变量,每个托盘创建一个线程。 /// <summary> /// 发送数据 /// </summary> /// <param name="clientId">客户端编号</param> /// <param name="size">数据大小</param> /// <param name="buf">数据包</param> /// <returns>错误码 TODO...</returns> private int SendData(int clientId, int size, List<byte[]> sendPacketList) { if (clientId <= 0)

return -2; if (sendPacketList == null || sendPacketList.Count <= 0 || size <= 0) return -3; //if (!m_KAIO.isRun) // return -2; //如果 commPowerList 个数大于 1,说明多个设备连接同一个中位机,即使用 一个 IP CommunicatePower commPower = FindCommunicatePower(clientId); if (commPower == null) return -1; if (commPower.ClientId == 0) return -4; bool result = false; lock (commPower.SyncRoot)//加锁 { foreach (byte[] sendDataUnit in sendPacketList) { if (sendDataUnit != null && sendDataUnit.Count() <= 0) continue; result = ISendBin(commPower.ClientId, sendDataUnit, sendDataUnit.Length) > 0 ? true : false; if (result) { if (OnSendMessageCommand != null) OnSendMessageCommand(this, new AcqReceiveMessageStreamEvent(sendDataUnit, DateTime.Now, commPower.IPAdress, commPower.Port)); } else { if (OnSendMessageCommand != null) OnSendMessageCommand(this, new AcqReceiveMessageStreamEvent(sendDataUnit, new DateTime(1970, 1, 1), commPower.IPAdress, commPower.Port)); } //if (result == false) //{ // Console.WriteLine("{0}",123456789); //} //Trace.WriteLine(CommonFunction.ByteArrayToHexStr(sendDataUnit)); } }

return 0; } 枚举或者在使用公共资源时,如果这个公共资源被某个线程进行写操作,那么就必须加锁。


相关文章:
...全局变量,则 ___ 。 A.在函数内只能访问局部变量,而不_百度题库
若程序中定义了局部变量与全局变量,则 ___ 。 A.在函数内只能访问局部变量,而不能访问全局变量B.局部变量与全局变量的名字不得相同C.若...
NJ局部变量---全局变量批量转换方法
NJ 局部变量批量转换为全局变量一. 背景 由于在编程时, 根据实际变动, 有可能需要将大批量的局部变量转换为全 局变量,但在 Sysmac studio 中,直接将需要转换的...
重要c语言全局变量和局部变量问题汇总
c 语言全局变量局部变量问题汇总 1、关键字 static 的作用是什么? 定义静态变量 2、static 有什么用途?(请至少说明两种) 网上答案: 1).限制变量的作用域(在...
labVIEW中局部变量与全局变量
很多教科书上都提示要慎用局部变量全局变量,主要有以下几个原因: 违背了数据流的编程 读取局部变量需要拷贝数据 不能象 SUBVI 一样可以重用数据 BUFFER 不利于...
局部变量、全局变量、静态局部变量、静态全局变量的异同
使用起来十分灵活,但最容易出问题; 6. 指针参数传递内存的方法及常见错误 P47-P49 二. 局部变量,全局变量,静态局部变量,静态全局变量的异同 局部变量, 全局变量...
...与全局变量,则___。 A.在函数内只能访问局部变量,但...
若程序中定义了局部变量与全局变量,则___。 A.在函数内只能访问局部变量,但不能访问全局变量B.局部变量与全局变量的名字不得相同C.一个函数被多次调用时,其定义...
以下叙述中正确的是A)局部变量说明为static存储数,其生存期将得到...
以下叙述中正确的是A)局部变量说明为static存储数,其生存期将得到延长B)全局变量说明为static存储类,其作用域将被扩大C)任何存储类的变量在未赋初值时,其值都是...
...与全局变量,则___。 A.在函数内只能访问局部变量,不...
若程序中定义了局部变量与全局变量,则___。 A.在函数内只能访问局部变量,不能访问全局变量B.局部变量与全局变量的名字不得相同C.一个函数被多次调用时,其定义的...
C语言 全局变量和局部变量的大小限制(堆栈区别)
变量|C语言 全局变量局部变量的大小限制(堆栈区别)_计算机软件及应用_IT/计算机_专业资料。全局变量 局部变量在内存中的存储位置说明,堆、栈、全局(静态)、文字...
Python语法基础——关于全局变量与局部变量
Python 语法基础——关于全局变量与局部变量 1、函数内部的变量名如果第一次出现,且出现在=前面,即被视为定义一个局部变量,不管全局域中有没有用到该变量名,...
更多相关标签: