怎么进行FileZilla源代码分析
怎么进行FileZilla源代码分析,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
FileZilla是一种快速、可信赖的FTP客户端以及服务器端开放源代码程式,具有多种特色、直觉的接口。小编就给大家分析下FileZilla的源代码。
< type="text/javascript"> < class="lazy" data-src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"> < type="text/javascript"> < class="lazy" data-src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
win32同步控制机制(Synchronization)回顾
Critical Sections(关键域)
最简单的一种同步机制,创建和销毁的函数是:
InitializeCriticalSection()
DeleteCriticalSection()
在被创建后,使用如下函数实现线程同步,
EnterCritSection()
... 需要同步的代码
LeaveCritSection()
即在同一时间内,EnterCritSection和LeaveCritSection中间的代码只能被一个线程处理。注意的问题是:
Critical Sections类型的变量并不是一个核心对象,即没有handle;
它存在于进程的内存空间中,即不可跨进程使用;
可能会导致死锁;
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更重量级,更慢,但也更灵活。
信号量(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也是核心对象。
事件(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"> < class="lazy" data-src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
关于怎么进行FileZilla源代码分析问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程网行业资讯频道了解更多相关知识。
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341