4、线程效率
虽然线程能够提高我们的程序的效率,然而,如果使用不当,反而会降低程序效率。特别是在线程同步的过程中,对于公共资源的读写保护部分。
看下面的例子(假设这是一个网络多线程下载程序,一个线程负责将下载的内容保存到文件,另外几个线程负责将数据加到队列中,下面写出保存线程的示例):
typedef struct
{
char m_pBuf[1024]; // … Data
}TNode, *PNode;
private:
CPtrList m_plTmpList;
CCriticalSection m_cLock;
POSITION posTmp;
PNode pItem = NULL;
m_cLock.Lock();
try
{
posTmp = m_plTmpList.GetTailPosition();
while(posTmp)
{
posPrev = posTmp;
pItem = (PNode)m_plTmpList.GetPrev(posTmp);
// 对于pItem进行处理,保存到磁盘
m_plTmp.RemoveAt(posPrev);
delete pItem;
}
m_cLock.Unlock();
}
catch(…)
{
m_cLock.Unlock();
}
通常情况下,我们会使用这种方式来遍历整个列表,然而,如果我们对于pItem的处理需要很长时间,比如我们要将pItem中的数据存放到硬盘上,那么这个过程将会非常耗时。其它线程将无法访问该列表。那么如何才能提高效率呢?我们可以使用两个队列,一个队列设置为下载队列,另外一个是当前保存队列。当保存队列中的所有内容全部保存到磁盘后,我们将下载队列和保存队列进行交换,即下载队列变成保存队列,保存队列变成下载队列。 600) this.width = 600;">
总之,在线程同步操作中,提高线程效率最重要的就是减少线程公共资源操作的时间,或者是采用其它方法避免同步。
5、后记(题外话)
当我们习惯于Windows下的RAD开发工具的时候,我们往往忽略了对于整个RDA环境的封装以及系统底层的探究,隐藏在操作系统内部的东西或机制往往被我们忽略。RAD工具大大提高了开发效率,然后它也助长了我们的惰性。很多人在抱怨大学里学习的东西都没有用,然而,现在看来,当初的很多东西都是很有用的,比如操作系统原理,数据结构和算法。我不是计算机的专业出身,我很庆幸当初自己对哪些东西略微了解了一些,以至于我现在理解起来一些东西不再那么困难。
理解Windows的运行原理,Windows的主要模块作用,对于软件开发有很大的帮助。很长一段时间里,我被Windows的华丽外衣所迷惑,整天还沉浸在DOS下的单任务环境,迷失在Windows下的软件开发中。幸好,现在终于走出了这片森林,看到了森林的一角。可以欣慰的说一声:我终于找到进入软件开发的大门了。
软件开发,是人和机器的交互过程。我们想让机器更好的为我们工作,我们就需要对机器有较多的认识,同时也要对我们所处的开发环境有较多的了解。
软件开发,不仅仅是一门技术,更是一门艺术。然后,在现在,能把它当成一门艺术来看待的人已经不多了…
上一页123下一页