FileZilla 原始碼分析3

來源:互聯網
上載者:User

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.