您好,登錄后才能下訂單哦!
怎么進(jìn)行FileZilla源代碼分析,針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。
FileZilla是一種快速、可信賴的FTP客戶端以及服務(wù)器端開(kāi)放源代碼程式,具有多種特色、直覺(jué)的接口。小編就給大家分析下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同步控制機(jī)制(Synchronization)回顧
1、Critical Sections(關(guān)鍵域)
最簡(jiǎn)單的一種同步機(jī)制,創(chuàng)建和銷毀的函數(shù)是:
InitializeCriticalSection()
DeleteCriticalSection()
在被創(chuàng)建后,使用如下函數(shù)實(shí)現(xiàn)線程同步,
EnterCritSection()
... 需要同步的代碼
LeaveCritSection()
即在同一時(shí)間內(nèi),EnterCritSection和LeaveCritSection中間的代碼只能被一個(gè)線程處理。注意的問(wèn)題是:
Critical Sections類型的變量并不是一個(gè)核心對(duì)象,即沒(méi)有handle;
它存在于進(jìn)程的內(nèi)存空間中,即不可跨進(jìn)程使用;
可能會(huì)導(dǎo)致死鎖;
2、Mutexes(互斥器)
創(chuàng)建和銷毀的函數(shù)是:
CreateMutex()
CloseHandle()
如果Mutex已經(jīng)被創(chuàng)建,這樣打開(kāi)和關(guān)閉:
OpenMutex()
ReleaseMutex()
使用的時(shí)候,用wait函數(shù)來(lái)等待Mutex,一旦沒(méi)有線程擁有這個(gè)Mutex,這個(gè)線程就會(huì)獲得這個(gè)Mutex,在這個(gè)線程處理完以后,調(diào)用ReleaseMutex()可以釋放這個(gè)Mutex,其它等待中的線程就會(huì)重新競(jìng)爭(zhēng)這個(gè)Mutex,同時(shí)只能有一個(gè)線程獲得這個(gè)Mutex,沒(méi)競(jìng)爭(zhēng)到的線程則處于blocking阻塞狀態(tài)。常見(jiàn)的wait函數(shù)有:
WaitForSingleObject() // 等待一個(gè)mutex
WaitForMultipleObjects() // 同時(shí)等待多個(gè)mutex,要不同時(shí)擁有多個(gè),要不一個(gè)也沒(méi)有
和Critical Sections相比,mutex是一個(gè)核心對(duì)象,因此是跨進(jìn)程的,即多個(gè)進(jìn)程可以使用同一個(gè)mutex,并且CreateMutex()的開(kāi)銷比InitializeCriticalSection()要大得多。
相比而言,mutex更重量級(jí),更慢,但也更靈活。
3、信號(hào)量(Semaphores)
創(chuàng)建和銷毀的函數(shù)是:
CreateSemaphore()
CloseHandle()
獲取這個(gè)Semaphore的函數(shù)同樣是那些wait函數(shù)WaitForSingleObject(), WaitForMultipleObjects()等等。
使用Semaphores的含義是:Semaphores可以同時(shí)被多個(gè)線程擁有,但在CreateSemaphore()時(shí)會(huì)指定一個(gè)同時(shí)擁有這個(gè)Semaphore的***線程數(shù),即每個(gè)線程調(diào)用wait函數(shù)獲取Semaphore時(shí),Semaphore內(nèi)部的可用值就會(huì)減1,一旦可用值為0,則線程必須等待。當(dāng)擁到Semaphore的線程運(yùn)行完后,也應(yīng)該調(diào)用ReleaseSemaphore()來(lái)釋放。
同Mutexes不一樣的是,調(diào)用ReleaseSemaphore()的線程并一定是調(diào)用wait并獲得擁有權(quán)的那個(gè)線程,即任何線程都可以在任何時(shí)間調(diào)用ReleaseSemaphore()來(lái)解除被任何線程鎖定的Semaphore。
在某種意義上,Mutexes可以看成是Semaphore的一個(gè)特例,即只能同時(shí)被一個(gè)線程鎖定的Semaphore。
Semaphore也是核心對(duì)象。
4、事件(Event Objects)
win32中最靈活的應(yīng)該是events了,它也是一種核心對(duì)象。
events的含義在于:events有兩種狀態(tài),激活和非激活,在events被激活時(shí),那些等待著的線程會(huì)被喚醒。
創(chuàng)建和銷毀的函數(shù)是:
CreateEvent(),創(chuàng)建時(shí)可以指定events是manual或automatic,manual的含義是events的狀態(tài)是由程序員設(shè)定的。automatic的含義是events變成激話后,立即自動(dòng)變成非激活。
CloseHandle()
獲取這個(gè)events的函數(shù)同樣是那些wait函數(shù)WaitForSingleObject(), WaitForMultipleObjects()等等。
下面三個(gè)方法可以改變events的狀態(tài):
SetEvent(): 把events設(shè)為激活
ResetEvent(): 把events設(shè)為非激活
PulseEvent(): 激活events,然后立即高為非激活。如果events是manual的,則喚醒所有等待的線程,如果events是automatic的,同喚醒“一個(gè)”等待的線程。
注意,如果event是manual時(shí),這時(shí)調(diào)用SetEvent后,如果不調(diào)用ResetEvent,則等待中的線程會(huì)被不斷的喚醒,即不斷地執(zhí)行CreateThread時(shí)指定的lpStartAddress方法。
還有一點(diǎn),windows系統(tǒng)可以保證被喚醒的線程是一個(gè)接著一個(gè)的,即不會(huì)有的線程總是被喚醒,而有些線程被餓死。
< type="text/javascript"> < src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
關(guān)于怎么進(jìn)行FileZilla源代碼分析問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。