91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么進行FileZilla源代碼分析

發布時間:2021-11-02 17:04:25 來源:億速云 閱讀:109 作者:柒染 欄目:系統運維

怎么進行FileZilla源代碼分析,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

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源代碼分析問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

盐津县| 离岛区| 贺兰县| 徐州市| 思南县| 垫江县| 安泽县| 宜君县| 土默特右旗| 安阳县| 喀喇沁旗| 卢氏县| 桃园县| 福清市| 东兴市| 永登县| 石城县| 汉川市| 凤凰县| 来安县| 泉州市| 寿宁县| 北票市| 乌拉特前旗| 东源县| 京山县| 建湖县| 盖州市| 岑巩县| 广昌县| 普格县| 濉溪县| 榆林市| 崇明县| 十堰市| 崇仁县| 江津市| 彰化县| 和龙市| 弋阳县| 长垣县|