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

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


局部变量有自己的内存空间,相互直接是独立,互补干扰的,所以没必要加锁。 而对于成员变量, 和全局变量在只读不写的情况下也不要加锁。 假如有一个线程对成员变量 和全局变量进行写操作是就必须加锁。加锁是一个好习惯。 /// <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; } 枚举或者在使用公共资源时,如果这个公共资源被某个线程进行写操作,那么就必须加锁。


赞助商链接
相关文章:
全局变量、局部变量、静态全局变量、静态局部变量的区别
全局变量局部变量、静态全局变量、静态局部变量的区别 C++变量根据定义位置的不同,具有不同的作用域,作用域可分为 6 种:全局作用域,局部作 用域,语句作用域,...
...全局变量,则 ___ 。 A.在函数内只能访问局部变量,而不_百度题库
若程序中定义了局部变量与全局变量,则 ___ 。 A.在函数内只能访问局部变量,而不能访问全局变量B.局部变量与全局变量的名字不得相同C.若...
局部变量、全局变量、静态局部变量、静态全局变量的异同
从静态存储区域分配:变量在编译时已经分配好,在整个程序运行期间都存 在,例如:全局变量,静态全局变量; (2).从“栈”上分配:函数内的局部变量,在使用时自动从栈...
C局部和全局变量问题汇总
c 语言全局变量局部变量问题汇总 收藏 1、局部变量能否和全局变量重名? 答:...有点类似于 c++中类的静 态成员变量, 即无论该类型生成多少个实例对象, 所有...
全局变量过多的坏处
在函数内引用这 个变量时,会用到同名的局部变量,而不会用到全局变量。 4....而且如果存在多个模块线程同时修改全局变量的话,也容易造成冲突,需要 加线程锁,...
局部变量和全局变量
8.8 局部变量和全局变量 8.8.1 局部变量局部变量:函数或分程序内定义的变量,只在本函数或本分程序内有效。 说明: (1)我们使用的变量一般是局部变量,main 函数...
labVIEW中局部变量与全局变量
很多教科书上都提示要慎用局部变量全局变量,主要有以下几个原因: 违背了数据流的编程 读取局部变量需要拷贝数据 不能象 SUBVI 一样可以重用数据 BUFFER 不利于...
C语言中局部变量与全局变量相关的问题
C语言中局部变量全局变量相关的问题_电脑基础知识_IT/计算机_专业资料。C语言中局部变量全局变量相关的问题enum 是枚举型 枚举类型 在实际问题中,有些变量的取...
全局变量和局部变量_图文
C 语言的变量 语言的变量一,全局变量局部变量按照变量的有效作用范围可划 分为局部变量和全局变量.局部变量是在一个函数内部定义的变量, 该变量只在定义它的...
labview谨慎使用全局变量
使用局部变量全局变量时,程序框图可能会变得难以阅读,因此需谨慎使用。错误 地使用局部变量全局变量, 如将其取代连线板或用其访问顺序结构中每一帧中的数值, ...
更多相关标签: