FileZilla 源代码分析3
创始人
2024-07-21 11:30:58
0

FileZilla是一种快速、可信赖的FTP客户端以及服务器端开放源代码程式,具有多种特色、直觉的接口。本文就给大家分析下FileZilla的源代码。

  < type="text/javascript"> < src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"> < type="text/javascript"> < src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">

  win32同步控制机制(Synchronization)回顾

  1、Critical Sections(关键域)

  最简单的一种同步机制,创建和销毁的函数是:

  InitializeCriticalSection()

  DeleteCriticalSection()

  在被创建后,使用如下函数实现线程同步,

  EnterCritSection()

  ... 需要同步的代码

  LeaveCritSection()

  即在同一时间内,EnterCritSection和LeaveCritSection中间的代码只能被一个线程处理。注意的问题是:

  Critical Sections类型的变量并不是一个核心对象,即没有handle;

  它存在于进程的内存空间中,即不可跨进程使用;

  可能会导致死锁;

  2、Mutexes(互斥器)

  创建和销毁的函数是:

  CreateMutex()

  CloseHandle()

  如果Mutex已经被创建,这样打开和关闭:

  OpenMutex()

  ReleaseMutex()

  使用的时候,用wait函数来等待Mutex,一旦没有线程拥有这个Mutex,这个线程就会获得这个Mutex,在这个线程处理完以后,调用ReleaseMutex()可以释放这个Mutex,其它等待中的线程就会重新竞争这个Mutex,同时只能有一个线程获得这个Mutex,没竞争到的线程则处于blocking阻塞状态。常见的wait函数有:

  WaitForSingleObject() // 等待一个mutex

  WaitForMultipleObjects() // 同时等待多个mutex,要不同时拥有多个,要不一个也没有

  和Critical Sections相比,mutex是一个核心对象,因此是跨进程的,即多个进程可以使用同一个mutex,并且CreateMutex()的开销比InitializeCriticalSection()要大得多。

  相比而言,mutex更重量级,更慢,但也更灵活。

  3、信号量(Semaphores)

  创建和销毁的函数是:

  CreateSemaphore()

  CloseHandle()

  获取这个Semaphore的函数同样是那些wait函数WaitForSingleObject(), WaitForMultipleObjects()等等。

  使用Semaphores的含义是:Semaphores可以同时被多个线程拥有,但在CreateSemaphore()时会指定一个同时拥有这个Semaphore的***线程数,即每个线程调用wait函数获取Semaphore时,Semaphore内部的可用值就会减1,一旦可用值为0,则线程必须等待。当拥到Semaphore的线程运行完后,也应该调用ReleaseSemaphore()来释放。

  同Mutexes不一样的是,调用ReleaseSemaphore()的线程并一定是调用wait并获得拥有权的那个线程,即任何线程都可以在任何时间调用ReleaseSemaphore()来解除被任何线程锁定的Semaphore。

  在某种意义上,Mutexes可以看成是Semaphore的一个特例,即只能同时被一个线程锁定的Semaphore。

  Semaphore也是核心对象。

  4、事件(Event Objects)

  win32中最灵活的应该是events了,它也是一种核心对象。

  events的含义在于:events有两种状态,激活和非激活,在events被激活时,那些等待着的线程会被唤醒。

  创建和销毁的函数是:

  CreateEvent(),创建时可以指定events是manual或automatic,manual的含义是events的状态是由程序员设定的。automatic的含义是events变成激话后,立即自动变成非激活。

  CloseHandle()

  获取这个events的函数同样是那些wait函数WaitForSingleObject(), WaitForMultipleObjects()等等。

  下面三个方法可以改变events的状态:

  SetEvent(): 把events设为激活

  ResetEvent(): 把events设为非激活

  PulseEvent(): 激活events,然后立即高为非激活。如果events是manual的,则唤醒所有等待的线程,如果events是automatic的,同唤醒“一个”等待的线程。

  注意,如果event是manual时,这时调用SetEvent后,如果不调用ResetEvent,则等待中的线程会被不断的唤醒,即不断地执行CreateThread时指定的lpStartAddress方法。

  还有一点,windows系统可以保证被唤醒的线程是一个接着一个的,即不会有的线程总是被唤醒,而有些线程被饿死。

  < type="text/javascript"> < src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">

通过文章完整的描述,大家应该知道了FileZilla 源代码,希望对大家有帮助!

【编辑推荐】

  1. FileZilla 源代码分析1
  2. FileZilla 源代码分析2
  3. FileZilla简单介绍
  4. FileZilla:免费的服务器软件
  5. FileZilla 3.3.1.0新版升级 修复bug
  6. FileZilla FTP 客户端硬编码的密码索引关键漏洞
  7. FileZilla Server

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...