freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

java多線程編程(五篇)-文庫吧

2025-07-31 12:09 本頁面


【正文】 原型和參數(shù)分別說明如下:(1)cwinthread* afxbeginthread(afx_threadproc pfnthreadproc,lpvoid pparam,npriority=thread_priority_normal,uint nstacksize=0,dword dwcreateflags=0,lpsecurity_attributes lpsecurityattrs=null)。pfnthreadproc:指向工作者線程的執(zhí)行函數(shù)的指針,線程函數(shù)原型必須聲明如下: uint executingfunction(lpvoid pparam)。請注意,executingfunction()應返回一個uint類型的值,用以指明該函數(shù)結(jié)束的原因。一般情況下,返回0表明執(zhí)行成功。pparam:傳遞給線程函數(shù)的一個32位參數(shù),執(zhí)行函數(shù)將用某種方式解釋該值。它可以是數(shù)值,或是指向一個結(jié)構(gòu)的指針,甚至可以被忽略;npriority:線程的優(yōu)先級。如果為0,則線程與其父線程具有相同的優(yōu)先級;nstacksize:線程為自己分配堆棧的大小,其單位為字節(jié)。如果nstacksize被設為0,則線程的堆棧被設置成與父線程堆棧相同大?。?dwcreateflags:如果為0,則線程在創(chuàng)建后立刻開始執(zhí)行。如果為create_suspend,則線程在創(chuàng)建后立刻被掛起;lpsecurityattrs:線程的安全屬性指針,一般為null;(2)cwinthread* afxbeginthread(cruntimeclass* pthreadclass,int npriority=thread_priority_normal,uint nstacksize=0,dword dwcreateflags=0,lpsecurity_attributes lpsecurityattrs=null)。pthreadclass 是指向 cwinthread 的一個導出類的運行時類對象的指針,該導出類定義了被創(chuàng)建的用戶界面線程的啟動、退出等;其它參數(shù)的意義同形式1。使用函數(shù)的這個原型生成的線程也有消息機制,在以后的例子中我們將發(fā)現(xiàn)同主線程的機制幾乎一樣。下面對cwinthread類的數(shù)據(jù)成員及常用函數(shù)進行簡要說明。 m_hthread:當前線程的句柄;m_nthreadid:當前線程的id;m_pmainwnd:指向應用程序主窗口的指針virtual bool cwinthread::initinstance()。重載該函數(shù)以控制用戶界面線程實例的初始化。初始化成功則返回非0值,否則返回0。用戶界面線程經(jīng)常重載該函數(shù),工作者線程一般不使用initinstance()。virtual int cwinthread::exitinstance()。在線程終結(jié)前重載該函數(shù)進行一些必要的清理工作。該函數(shù)返回線程的退出碼,0表示執(zhí)行成功,非0值用來標識各種錯誤。同initinstance()成員函數(shù)一樣,該函數(shù)也只適用于用戶界面線程。 mfc多線程編程實例例程5 multithread5 為了與win32 api對照,使用mfc 類庫編程實現(xiàn)例程3 multithread3。例程6 multithread6[用戶界面線程] l 創(chuàng)建用戶界面線程的步驟:(以cuithread類為例)class cuithread : public cwinthread { declare_dyncreate(cuithread)protected: cuithread()。// protected constructor used by dynamic creation// attributes public: // operations public:// overrides // classwizard generated virtual function overrides //{{afx_virtual(cuithread)public: virtual bool initinstance()。virtual int exitinstance()。//}}afx_virtual // implementation protected: virtual ~cuithread()。// generated message map functions //{{afx_msg(cuithread)// notethe classwizard will add and remove member functions here.//}}afx_msgdeclare_message_map()}。()和exitinstance()。bool cuithread::initinstance(){ cframewnd* wnd=new cframewnd。wndcreate(null,“ui thread window”)。wndshowwindow(sw_show)。wndupdatewindow()。m_pmainwnd=wnd。return true。} void cuithreaddlg::onbutton1(){}請注意以下兩點:a、的開頭加入語句: include “” b、()的構(gòu)造函數(shù)的特性由 protected 改為 public。cuithread* pthread=new cuithread()。pthreadcreatethread()。用戶界面線程的執(zhí)行次序與應用程序主線程相同,首先調(diào)用用戶界面線程類的initinstance()函數(shù),如果返回true,繼續(xù)調(diào)用線程的run()函數(shù),該函數(shù)的作用是運行一個標準的消息循環(huán),并且當收到wm_quit消息后中斷,在消息循環(huán)過程中,run()函數(shù)檢測到線程空閑時(沒有消息),也將調(diào)用onidle()函數(shù),最后run()函數(shù)返回,mfc調(diào)用exitinstance()函數(shù)清理資源。你可以創(chuàng)建一個沒有界面而有消息循環(huán)的線程,例如:你可以從cwinthread派生一個新類,在initinstance函數(shù)中完成某項任務并返回false,這表示僅執(zhí)行initinstance函數(shù)中的任務而不執(zhí)行消息循環(huán),你可以通過這種方法,完成一個工作者線程的功能。三、線程間通訊一般而言,應用程序中的一個次要線程總是為主線程執(zhí)行特定的任務,這樣,主線程和次要線程間必定有一個信息傳遞的渠道,也就是主線程和次要線程間要進行通信。這種線程間的通信不但是難以避免的,而且在多線程編程中也是復雜和頻繁的,下面將進行說明。由于屬于同一個進程的各個線程共享操作系統(tǒng)分配該進程的資源,故解決線程間通信最簡單的一種方法是使用全局變量。對于標準類型的全局變量,建議使用volatile 修飾符,它告訴編譯器無需對該變量作任何的優(yōu)化,即無需將它放到一個寄存器中,并且該值可被外部改變。如果線程間所需傳遞的信息較復雜,可以定義一個結(jié)構(gòu),通過傳遞指向該結(jié)構(gòu)的指針進行傳遞信息。可以在一個線程的執(zhí)行函數(shù)中向另一個線程發(fā)送自定義的消息來達到通信的目的。一個線程向另外一個線程發(fā)送消息是通過操作系統(tǒng)實現(xiàn)的。利用windows操作系統(tǒng)的消息驅(qū)動機制,當一個線程發(fā)出一條消息時,操作系統(tǒng)首先接收到該消息,然后把該消息轉(zhuǎn)發(fā)給目標線程,接收消息的線程必須已經(jīng)建立了消息循環(huán)。例程globalobjecttest 該例程演示了如何利用全局變量進行通信例程7[multithread7] 該例程演示了如何使用自定義消息進行線程間通信。首先,主線程向ccalculatethread線程發(fā)送消息wm_calculate,ccalculatethread線程收到消息后進行計算,再向主線程發(fā)送wm_display消息,主線程收到該消息后顯示計算結(jié)果。步驟:四、線程的同步雖然多線程能給我們帶來好處,但是也有不少問題需要解決。例如,對于像磁盤驅(qū)動器這樣獨占性系統(tǒng)資源,由于線程可以執(zhí)行進程的任何代碼段,且線程的運行是由系統(tǒng)調(diào)度自動完成的,具有一定的不確定性,因此就有可能出現(xiàn)兩個線程同時對磁盤驅(qū)動器進行操作,從而出現(xiàn)操作錯誤;又例如,對于銀行系統(tǒng)的計算機來說,可能使用一個線程來更新其用戶數(shù)據(jù)庫,而用另外一個線程來讀取數(shù)據(jù)庫以響應儲戶的需要,極有可能讀數(shù)據(jù)庫的線程讀取的是未完全更新的數(shù)據(jù)庫,因為可能在讀的時候只有一部分數(shù)據(jù)被更新過。使隸屬于同一進程的各線程協(xié)調(diào)一致地工作稱為線程的同步。mfc提供了多種同步對象,下面只介紹最常用的四種:臨界區(qū)(ccriticalsection)事件(cevent)互斥量(cmutex)信號量(csemaphore)通過這些類,可以比較容易地做到線程同步。 ccriticalsection 類當多個線程訪問一個獨占性共享資源時,可以使用“臨界區(qū)”對象。任一時刻只有一個線程可以擁有臨界區(qū)對象,擁有臨界區(qū)的線程可以訪問被保護起來的資源或代碼段,其他希望進入臨界區(qū)的線程將被掛起等待,直到擁有臨界區(qū)的線程放棄臨界區(qū)時為止,這樣就保證了不會在同一時刻出現(xiàn)多個線程訪問共享資源。ccriticalsection類的用法非常簡單,步驟如下:(以使各個線程均能訪問),如ccriticalsection critical_section;,調(diào)用ccriticalsection類的成員lock()獲得臨界區(qū)對象: ()。如果此時沒有其它線程占有臨界區(qū)對象,則調(diào)用lock()的線程獲得臨界區(qū);否則,線程將被掛起,并放入到一個系統(tǒng)隊列中等待,直到當前擁有臨界區(qū)的線程釋放了臨界區(qū)時為止。,使用ccriticalsection的成員函數(shù)unlock()來釋放臨界區(qū):()。通俗講,()。語句時,如果其它線程(b)()。()。語句前的語句時,線程a就會等待,直到線程b執(zhí)行完()。語句,線程a才會繼續(xù)執(zhí)行。例程8 multithread8 cevent 類cevent 類提供了對事件的支持。事件是一個允許一個線程在某種情況發(fā)生時,喚醒另外一個線程的同步對象。例如在某些網(wǎng)絡應用程序中,一個線程(記為a)負責監(jiān)聽通訊端口,另外一個線程(記為b)負責更新用戶數(shù)據(jù)。通過使用cevent 類,線程a可以通知線程b何時更新用戶數(shù)據(jù)。每一個cevent 對象可以有兩種狀態(tài):有信號狀態(tài)和無信號狀態(tài)。線程監(jiān)視位于其中的cevent 類對象的狀態(tài),并在相應的時候采取相應的操作。在mfc中,cevent 類對象有兩種類型:人工事件和自動事件。一個自動cevent 對象在被至少一個線程釋放后會自動返回到無信號狀態(tài);而人工事件對象獲得信號后,釋放可利用線程,但直到調(diào)用成員函數(shù)resetevent()才將其設置為無信號狀態(tài)。在創(chuàng)建cevent 類的對象時,默認創(chuàng)建的是自動事件。cevent 類的各成員函數(shù)的原型和參數(shù)說明如下:cevent(bool binitiallyown=false,bool bmanualreset=false,lpctstr lpszname=null,lpsecurity_attributes lpsaattribute=null)。binitiallyown:指定事件對象初始化狀態(tài),true為有信號,false為無信號;bmanualreset:指定要創(chuàng)建的事件是屬于人工事件還是自動事件。true為人工事件,false為自動事件;后兩個參數(shù)一般設為null,在此不作過多說明。bool cevent::setevent()。將 cevent 類對象的狀態(tài)設置為有信號狀態(tài)。如果事件是人工事件,則 cevent 類對象保持為有信號狀態(tài),直到調(diào)用成員函數(shù)resetevent()將 其重新設為無信號狀態(tài)時為止。如果cevent 類對象為自動事件,則在setevent()將事件設置為有信號狀態(tài)后,cevent 類對象由系統(tǒng)自動重置為無信號狀態(tài)。如果該函數(shù)執(zhí)行成功,則返回非零值,否則返回零。bool cevent::resetevent()。該函數(shù)將事件的狀態(tài)設置為無信號狀態(tài),并保持該狀態(tài)直至setevent()被調(diào)用時為止。由于自動事件是由系統(tǒng)自動重置,故自動事件不需要調(diào)用該函數(shù)。如果該函數(shù)執(zhí)行成功,返回非零值,否則返回零。一般通過調(diào)用waitforsingleobject函數(shù)來監(jiān)視事件狀態(tài)。前面已經(jīng)介紹了該函數(shù)。由于語言描述的原因,cevent 類的理解確實有些難度,只要通過下面例程,多看幾遍就可理解。例程9 multithread9 仔細分析這兩個線程函數(shù), 就會正確理解cevent 類。線程writed執(zhí)行到 waitforsingleobject(,infinite)。處等待,直到事件eventwrited為有信號該線程才往下執(zhí)行,因為eventwrited對象是自動事件,則當waitforsingleobject()返回時,系統(tǒng)自動把eventwrited對象重置為無信號狀態(tài)。 類:互斥對象可以在進程間使用,而臨界區(qū)對象只能在同一進程的各線程間使用。當然,互斥對象也可以用于同一進程的各個線程間,但是在這種情況下,使用臨界區(qū)會更節(jié)省系統(tǒng)資源,更有效率。 類當需要一個計數(shù)器來限制可以使用某個線程的數(shù)目時,可以使用“信號量”對象。csemaphore 類的對象保存了對當前訪問某一指定資源的線程的計數(shù)值,該計數(shù)值是當前還可以使用該資源的線程的數(shù)目。如果這個計數(shù)達到了零,則所有對這個csemaphore 類對象所控制的資源的訪問嘗試都被放入到一個隊列中等待,直到超時或計數(shù)值不為零時為止。一個線程被釋放已訪問了被保護的資源時,計數(shù)值減1;一個線程完成了對被控共享資源的訪問時,計數(shù)值增1。這個被csemaphore 類對象所控制的資源可以同時接受訪問的最大線程數(shù)在該對象的構(gòu)建函數(shù)中指定。csemaphore 類的構(gòu)造函數(shù)原型及參數(shù)說明如下:csemaphore(long linitialcount=1,long lmaxcount=1,lpctstr pstrname=null,lpsecurity_attributes lpsaattributes=null
點擊復制文檔內(nèi)容
教學課件相關推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1