c语言调用createthread线程的头文件_易语言API多线程总汇
【thread】 即,線程,是進程中某一順序的控制流,在單個程序中同時運行多個線程完成不同工作,稱為多線程。
易語言多線程
理解:進程是一個可執行程序,由私有虛擬地址空間、代碼、數據和其它操作系統資源組成,一個應用程序可以有一個或多個進程,一個進程 可以有一個多個線程,其中一個是主線程。函數功能 初始化一個臨界資源對象。
【臨界資源】
臨界資源是指每次僅允許一個進程訪問的資源。
屬于臨界資源的硬件有打印機、磁帶機等,軟件有消息緩沖隊列、變量、數組、緩沖區等。 諸進程間應采取互斥方式,實現對這種資源的共享。
每個進程中訪問臨界資源的那段代碼稱為臨界區。顯然,若能保證諸進程互斥地進入自己的臨界區,便可實現諸進程對臨界資源的互斥訪問。為此,每個進程在進入臨界區之前,應先對欲訪問的臨界資源進行檢查,看它是否正被訪問。如果此刻該臨界資源未被訪問,進程便可進入臨界區對該資源進行訪問,并設置它正被訪問的標志;如果此刻該臨界資源正被某進程訪問,則本進程不能進入臨界區。
在操作系統中,有臨界區的概念。臨界區內放的一般是被1個以上的進程或線程(以下只說進程)共用的數據。
臨界區內的數據一次只能同時被一個進程使用,當一個進程使用臨界區內的數據時,其他需要使用臨界區數據的進程進入等待狀態。
操作系統需要合理的分配臨界區以達到多進程的同步和互斥關系,如果協調不好,就容易使系統處于不安全狀態,甚至出現死鎖現象。
【臨界區】Critical Section
簡介:
不論是硬件臨界資源,還是軟件臨界資源,多個進程必須互斥地對它進行訪問。每個進程中訪問臨界資源的那段代碼稱為臨界區(Critical Section)(臨界資源是一次僅允許一個進程使用的共享資源)。每次只準許一個進程進入臨界區,進入后不允許其他進程進入。不論是硬件臨界資源,還是軟件臨界資源,多個進程必須互斥地對它進行訪問。
多個進程中涉及到同一個臨界資源的臨界區稱為相關臨界區。
程序調度法則:進程進入臨界區的調度原則是:
1、如果有若干進程要求進入空閑的臨界區,一次僅允許一個進程進入。
2、任何時候,處于臨界區內的進程不可多于一個。如已有進程進入自己的臨界區,則其它所有試圖進入臨界區的進程必須等待。
3、進入臨界區的進程要在有限時間內退出,以便其它進程能及時進入自己的臨界區。
4、如果進程不能進入自己的臨界區,則應讓出CPU,避免進程出現“忙等”現象。線程同步問題:
有多個線程試圖同時訪問臨界區,那么在有一個線程進入后其他所有試圖訪問此臨界區的線程將被掛起(等待),并一直持續到進入臨界區的線程離開。臨界區在被釋放后,其他線程可以繼續搶占,并以此達到用原子方式操作共享資源的目的。
臨界區在使用時以CRITICAL_SECTION結構對象保護共享資源,并分別用EnterCriticalSection()和LeaveCriticalSection()函數去標識和釋放一個臨界區。所用到的CRITICAL_SECTION結構對象必須經過InitializeCriticalSection()的初始化后才能使用,而且必須確保所有線程中的任何試圖訪問此共享資源的代碼都處在此臨界區的保護之下。否則臨界區將不會起到應有的作用,共享資源依然有被破壞的可能。
下面通過一段代碼展示了臨界區在保護多線程訪問的共享資源中的作用。通過兩個線程來分別對全局變量g_cArray[10]進行寫入操作,用臨界區結構對象g_cs來保持線程的同步,并在開啟線程前對其進行初始化。為了使實驗效果更加明顯,體現出臨界區的作用,在線程函數對共享資源g_cArray[10]的寫入時,以Sleep()函數延遲1毫秒,使其他線程同其搶占CPU的可能性增大。如果不使用臨界區對其進行保護,則共享資源數據將被破壞,而使用臨界區對線程保持同步后則可以得到正確的結果。
【創建多線程許可證】:InitializeCriticalSection
初始化一個臨界資源對象。
參數:
lpCriticalSection 臨界資源對象指針
無返回值
【線程鎖】
EnterCriticalSection; LeaveCriticalSection
多個線程操作相同的數據時,一般是需要按順序訪問的,否則會引導數據錯亂,無法控制數據,變成隨機變量。為解決這個問題,就需要引入互斥變量,讓每個線程都按順序地訪問變量。這樣就需要使用EnterCriticalSection和LeaveCriticalSection函數。
【創建一個線程】CreateThread
當使用CreateProcess調用時,系統將創建一個進程和一個主線程。CreateThread將在主線程的基礎上創建一個新線程
庫文件名:kernel32
參數:
lpThreadAttributes:線程屬性(整數型)
dwStackSize:線程棧大小,如果為0,那么默認將使用與調用該函數的線程相同的棧空間大小(整數型)
lpStartAddress:子程序子針型
lpParameter:向線程傳遞的參數(整數型)
dwCreationFlags :設置線程被創建后的狀態,如果為0表示,創建后立即運行,如果為4,表示線程被創建后處于掛起狀態。
lpThreadId:保存新線程的ID(整數型)(要傳址)提供一個整數型變量,用來接收創建成功后的線程ID.線程ID在系統范圍內是唯一的.如果不提供,請置0
返回值:
函數成功,返回線程句柄;函數失敗返回false。
【關閉線程句柄】CloseHandle
庫文件名:kernel32說明:關閉一個內核對象。其中包括文件、文件映射、進程、線程、安全和同步對象等參數:hObject Long:欲關閉的一個對象的句柄返回值:Long,非零表示成功,零表示失敗。【線程掛起】SuspendThread
庫文件名:kernel32
參數:hthread
參數類型:整數型
【線程恢復】ResumeThread
【臨界資源對象指針】(多線程許可證)
成員:成員 DebugInfo, 整數型, , , 調試信息成員 LockCount, 整數型, , , 鎖定計數成員 RecursionCount, 整數型, , , 遞歸計數成員 OwningThread, 整數型, , , 擁有線程成員 LockSemaphore, 整數型, , , 鎖定信號量成員 SpinCount, 整數型, , , 自旋計數總結
以上是生活随笔為你收集整理的c语言调用createthread线程的头文件_易语言API多线程总汇的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sata接口测试软件,如何查看电脑是否支
- 下一篇: 用python画长方形_Python+o