• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            C++ Programmer's Cookbook

            {C++ 基礎} {C++ 高級} {C#界面,C++核心算法} {設計模式} {C#基礎}

            C++多線程(八)

            多線程同步之Event(主要用來線程間的等待通知
             
            一 Event
                 在所有的內核對象中,事件內核對象是個最基本的對象。它們包含一個使用計數(與所有內核對象一樣),一個用于指明該事件是個自動重置的事件還是一個人工重置的事件的布爾值,另一個用于指明該事件處于已通知狀態還是未通知狀態的布爾值。

                    事件能夠通知一個操作已經完成。有兩種不同類型的事件對象。一種是人工重置的事件,另一種是自動重置的事件。當人工重置的事件得到通知時,等待該事件的所有線程均變為可調度線程。當一個自動重置的事件得到通知時,等待該事件的線程中只有一個線程變為可調度線程。

                    當一個線程執行初始化操作,然后通知另一個線程執行剩余的操作時,事件使用得最多。事件初始化為未通知狀態,然后,當該線程完成它的初始化操作后,它就將事件設置為已通知狀態。這時,一直在等待該事件的另一個線程發現該事件已經得到通知,因此它就變成可調度線程。

                     Microsoft為自動重置的事件定義了應該成功等待的副作用規則,即當線程成功地等待到該對象時,自動重置的事件就會自動重置到未通知狀態。這就是自動重置的事件如何獲得它們的名字的方法。通常沒有必要為自動重置的事件調用ResetEvent函數,因為系統會自動對事件進行重置。但是,Microsoft沒有為人工重置的事件定義成功等待的副作用,所以需要調用ResetEvent()。

            二 Event API

            Event function Description
            CreateEvent Creates or opens a named or unnamed event object.
            CreateEventEx Creates or opens a named or unnamed event object and returns a handle to the object.
            OpenEvent Opens an existing named event object.
            PulseEvent Sets the specified event object to the signaled state and then resets it to the nonsignaled state after releasing the appropriate number of waiting threads.
            ResetEvent Sets the specified event object to the nonsignaled state.
            SetEvent Sets the specified event object to the signaled state.


            三 代碼實例

            1)使用手動的Event:當文件讀入內存的時候,WordCount, SpellCheck,GrammarCheck可以同時進行,這里使用Event,當文件一讀入內存就通知WordCount,SpellCheck和GrammarCheck線程開始執行。
            #include <windows.h>
            #include 
            <process.h>
            #include 
            <stdio.h>

            // a global handle to event.
            HANDLE g_hEvent;

            void OpenFileAndReadContentsIntoMemory();
            unsigned __stdcall WordCount(
            void *pvParam);
            unsigned __stdcall SpellCheck(
            void *pvParam);
            unsigned __stdcall GrammarCheck(
            void *pvParam);

            int main() 
            {
               
            //Create the manual-reset, nonsignaled event.
               g_hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

               
            //Spawn 3 new threads.
               HANDLE hThread[3];
               unsigned dwThreadID[
            3];
               hThread[
            0= (HANDLE)_beginthreadex(NULL, 0, WordCount, NULL, 0&dwThreadID[0]);
               hThread[
            1= (HANDLE)_beginthreadex(NULL, 0, SpellCheck, NULL, 0&dwThreadID[1]);
               hThread[
            2= (HANDLE)_beginthreadex(NULL, 0, GrammarCheck, NULL, 0&dwThreadID[2]);

               OpenFileAndReadContentsIntoMemory();

               
            //Allow all 3 threads to access the memory.
               SetEvent(g_hEvent); 

               printf(
            "main thread exit\n");
               
            return 1;
            }

            void OpenFileAndReadContentsIntoMemory()
            {
              printf(
            "Open File and Read contents into memory\n");
            }

            unsigned __stdcall WordCount(
            void *pvParam) 
            {
               
            //Wait until the file's data is in memory.
               WaitForSingleObject(g_hEvent, INFINITE);

               
            //Access the memory block.
               printf("0:word count\n");
               
            return(0);
            }

            unsigned __stdcall SpellCheck(
            void *pvParam)
            {
               
            //Wait until the file's data is in memory.
               WaitForSingleObject(g_hEvent, INFINITE);

               
            //Access the memory block.
               printf("1:Spell check\n");
               
            return(0);
            }

            unsigned __stdcall GrammarCheck(
            void *pvParam)
            {
               
            //Wait until the file's data is in memory.
               WaitForSingleObject(g_hEvent, INFINITE);

               
            //Access the memory block.
               printf("2:Grammar check\n");
               
            return(0);
            }

            2)修改上面的代碼,使用自動Event,則必須在3個子線程中增加SetEvent()。且要想讓3個線程都執行完,必須的增加Waitfor()函數。

            #include <windows.h>
            #include 
            <process.h>
            #include 
            <stdio.h>

            // a global handle to event.
            HANDLE g_hEvent;

            void OpenFileAndReadContentsIntoMemory();
            unsigned __stdcall WordCount(
            void *pvParam);
            unsigned __stdcall SpellCheck(
            void *pvParam);
            unsigned __stdcall GrammarCheck(
            void *pvParam);

            int main() 
            {
               
            //Create the AUTO-reset, nonsignaled event.
               g_hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);

               
            //Spawn 3 new threads.
               HANDLE hThread[3];
               unsigned dwThreadID[
            3];
               hThread[
            0= (HANDLE)_beginthreadex(NULL, 0, WordCount, NULL, 0&dwThreadID[0]);
               hThread[
            1= (HANDLE)_beginthreadex(NULL, 0, SpellCheck, NULL, 0&dwThreadID[1]);
               hThread[
            2= (HANDLE)_beginthreadex(NULL, 0, GrammarCheck, NULL, 0&dwThreadID[2]);

               OpenFileAndReadContentsIntoMemory();

               
            //Allow all 3 threads to access the memory.
               SetEvent(g_hEvent); 

                
            //wait for child threads to exit
                DWORD dwCThd = WaitForMultipleObjects (3//count of objects
                                                    hThread, //thread handle
                                                    TRUE, //wait for all
                                                    INFINITE); //time out interval
                if(dwCThd != WAIT_OBJECT_0)
                
            {
                    printf(
            "error\n");
                    exit(
            -1);
                }


                
            //close handles
                CloseHandle (g_hEvent);
                
            //close child thread handles
                for (int i=0; i<3; i++)
                    CloseHandle (hThread[i]);

               printf(
            "main thread exit\n");
               
            return 1;
            }

            void OpenFileAndReadContentsIntoMemory()
            {
              printf(
            "Open File and Read contents into memory\n");
            }

            unsigned __stdcall WordCount(
            void *pvParam) 
            {
               
            //Wait until the file's data is in memory.
               WaitForSingleObject(g_hEvent, INFINITE);

               
            //Access the memory block.
               printf("0:word count\n");
               SetEvent(g_hEvent);

               
            return(0);
            }

            unsigned __stdcall SpellCheck(
            void *pvParam)
            {
               
            //Wait until the file's data is in memory.
               WaitForSingleObject(g_hEvent, INFINITE);

               
            //Access the memory block.
               printf("1:Spell check\n");
               SetEvent(g_hEvent);

               
            return(0);
            }

            unsigned __stdcall GrammarCheck(
            void *pvParam)
            {
               
            //Wait until the file's data is in memory.
               WaitForSingleObject(g_hEvent, INFINITE);

               
            //Access the memory block.
               printf("2:Grammar check\n");

               SetEvent(g_hEvent);

               
            return(0);
            }

            四 參考
            windows核心編程

            posted on 2007-07-31 14:59 夢在天涯 閱讀(4502) 評論(5)  編輯 收藏 引用 所屬分類: CPlusPlus

            評論

            # re: C++多線程(八)[未登錄] 2007-08-01 08:34 漂舟

            這一系列標題寫得有誤解, 看著總有上當的感覺,
            應該叫 Windows多線程 吧。  回復  更多評論   

            # re: C++多線程(八) 2007-08-01 09:00 夢在天涯

            應該是C++多線程在windows上的實現。  回復  更多評論   

            # re: C++多線程(八)[未登錄] 2007-08-01 21:39 創系

            建議LZ把題目改為"windows 多線程"。  回復  更多評論   

            # re: C++多線程(八) 2007-10-26 11:11 zhang-gq

            不錯。謝謝。  回復  更多評論   

            # re: C++多線程(八) 2009-06-10 14:47 aniki

            學習中,以前用過.net封裝后的event,看到這塊似曾相識啊  回復  更多評論   

            公告

            EMail:itech001#126.com

            導航

            統計

            • 隨筆 - 461
            • 文章 - 4
            • 評論 - 746
            • 引用 - 0

            常用鏈接

            隨筆分類

            隨筆檔案

            收藏夾

            Blogs

            c#(csharp)

            C++(cpp)

            Enlish

            Forums(bbs)

            My self

            Often go

            Useful Webs

            Xml/Uml/html

            搜索

            •  

            積分與排名

            • 積分 - 1807577
            • 排名 - 5

            最新評論

            閱讀排行榜

            精品少妇人妻av无码久久| 久久精品国产99国产精偷| 国产午夜福利精品久久| 97超级碰碰碰碰久久久久| 久久精品无码免费不卡| 久久精品国产亚洲AV不卡| 国产高潮国产高潮久久久| 99久久久久| 亚洲一区精品伊人久久伊人 | 少妇久久久久久久久久| 久久久精品午夜免费不卡| 97香蕉久久夜色精品国产| 久久777国产线看观看精品| 久久国内免费视频| 四虎国产精品免费久久久| 狠狠色丁香久久婷婷综合蜜芽五月 | 国内精品久久久久久久涩爱| 亚洲精品久久久www| 久久精品国内一区二区三区| 99精品久久久久久久婷婷| 久久九九久精品国产| 99久久国语露脸精品国产| 中文国产成人精品久久不卡| 国产日韩久久免费影院| 国产精品国色综合久久| 日韩人妻无码一区二区三区久久| 久久嫩草影院免费看夜色| 久久se精品一区精品二区| 亚洲中文字幕无码久久2017| 色婷婷狠狠久久综合五月| 激情综合色综合久久综合| 亚洲国产精品热久久| 久久99中文字幕久久| 精品一区二区久久| 99国产欧美久久久精品蜜芽| 久久精品中文字幕无码绿巨人| 性欧美大战久久久久久久| 亚洲精品美女久久久久99小说| 久久久久亚洲?V成人无码| 久久这里只有精品视频99| 久久国产精品波多野结衣AV|