自己在鼓弄自己的小项目,要用到多线程技术自然就要用到考虑资源的访问。以前觉没有什么,现在自己写这么一个小项目稍微改一下代码就出现死锁。
代码没有多少行,但要找半天才能发现代码逻辑错误。
所以使用互斥或者临界区域等等来解决资源竞争的问题时候要非常注意代码书写,这个就好像宏定义一样,稍微不注意就发生错误,而且这些错误不是很好的定位。所以有经验人写宏都有特殊格式防止引起错误。
在我的代码中学习总结出2点:
1: 控制竞争代码尽量只包含要访问的资源
因为控制过多的代码实在不好控制,比喻你控制代码有一个break(假设在while或者for的里面)或者return 那么就很可能出现死锁,你稍微不注意还不知道哪里出现代码错误。
2:访问资源时候,最好把资源内容用局部变量保存起来。
比喻下面代码
开始错误代码
for(int i = 0; i < g_ThreadNum; i++)
{
EnterCriticalSection(&cs_FilePacket);
if(Port[i].State == false)
{
nPort = Port[i].port;
Port[i].State = true;
break;
}
LeaveCriticalSection(&cs_FilePacket);
}
这里发送错误有点与第一条类似,不要控制过多代码。
下面是按照第二条写的话,这样子就不会发送错误。
for(int i = 0; i < g_ThreadNum; i++)
{
EnterCriticalSection(&cs_FilePacket);
GlobalPort p = Port[i];
LeaveCriticalSection(&cs_FilePacket);
if(p.State == false)
{
nPort = p.port;
p.State = true;
EnterCriticalSection(&cs_FilePacket);
Port[i] = p;
LeaveCriticalSection(&cs_FilePacket);
break;
}
}
上面就是我写代码一些收获。
今天逛博客学到很一样很重要东西:学会做事,先学会做人。从心里明白了这句话了。
code code up