• <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++ 基礎(chǔ)} {C++ 高級(jí)} {C#界面,C++核心算法} {設(shè)計(jì)模式} {C#基礎(chǔ)}

            C++多線程(八)

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

                    事件能夠通知一個(gè)操作已經(jīng)完成。有兩種不同類型的事件對(duì)象。一種是人工重置的事件,另一種是自動(dòng)重置的事件。當(dāng)人工重置的事件得到通知時(shí),等待該事件的所有線程均變?yōu)榭烧{(diào)度線程。當(dāng)一個(gè)自動(dòng)重置的事件得到通知時(shí),等待該事件的線程中只有一個(gè)線程變?yōu)榭烧{(diào)度線程。

                    當(dāng)一個(gè)線程執(zhí)行初始化操作,然后通知另一個(gè)線程執(zhí)行剩余的操作時(shí),事件使用得最多。事件初始化為未通知狀態(tài),然后,當(dāng)該線程完成它的初始化操作后,它就將事件設(shè)置為已通知狀態(tài)。這時(shí),一直在等待該事件的另一個(gè)線程發(fā)現(xiàn)該事件已經(jīng)得到通知,因此它就變成可調(diào)度線程。

                     Microsoft為自動(dòng)重置的事件定義了應(yīng)該成功等待的副作用規(guī)則,即當(dāng)線程成功地等待到該對(duì)象時(shí),自動(dòng)重置的事件就會(huì)自動(dòng)重置到未通知狀態(tài)。這就是自動(dòng)重置的事件如何獲得它們的名字的方法。通常沒(méi)有必要為自動(dòng)重置的事件調(diào)用ResetEvent函數(shù),因?yàn)橄到y(tǒng)會(huì)自動(dòng)對(duì)事件進(jìn)行重置。但是,Microsoft沒(méi)有為人工重置的事件定義成功等待的副作用,所以需要調(diào)用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.


            三 代碼實(shí)例

            1)使用手動(dòng)的Event:當(dāng)文件讀入內(nèi)存的時(shí)候,WordCount, SpellCheck,GrammarCheck可以同時(shí)進(jìn)行,這里使用Event,當(dāng)文件一讀入內(nèi)存就通知WordCount,SpellCheck和GrammarCheck線程開始執(zhí)行。
            #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)修改上面的代碼,使用自動(dòng)Event,則必須在3個(gè)子線程中增加SetEvent()。且要想讓3個(gè)線程都執(zhí)行完,必須的增加Waitfor()函數(shù)。

            #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 夢(mèng)在天涯 閱讀(4500) 評(píng)論(5)  編輯 收藏 引用 所屬分類: CPlusPlus

            評(píng)論

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

            這一系列標(biāo)題寫得有誤解, 看著總有上當(dāng)?shù)母杏X(jué),
            應(yīng)該叫 Windows多線程 吧。  回復(fù)  更多評(píng)論   

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

            應(yīng)該是C++多線程在windows上的實(shí)現(xiàn)。  回復(fù)  更多評(píng)論   

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

            建議LZ把題目改為"windows 多線程"。  回復(fù)  更多評(píng)論   

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

            不錯(cuò)。謝謝。  回復(fù)  更多評(píng)論   

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

            學(xué)習(xí)中,以前用過(guò).net封裝后的event,看到這塊似曾相識(shí)啊  回復(fù)  更多評(píng)論   

            公告

            EMail:itech001#126.com

            導(dǎo)航

            統(tǒng)計(jì)

            • 隨筆 - 461
            • 文章 - 4
            • 評(píng)論 - 746
            • 引用 - 0

            常用鏈接

            隨筆分類

            隨筆檔案

            收藏夾

            Blogs

            c#(csharp)

            C++(cpp)

            Enlish

            Forums(bbs)

            My self

            Often go

            Useful Webs

            Xml/Uml/html

            搜索

            •  

            積分與排名

            • 積分 - 1804434
            • 排名 - 5

            最新評(píng)論

            閱讀排行榜

            亚洲午夜无码AV毛片久久| 欧美午夜A∨大片久久 | 国产精品无码久久四虎| 国内精品久久久久影院薰衣草 | 国产精品美女久久久免费| 久久久久国产一级毛片高清板| 久久精品无码专区免费青青| 区久久AAA片69亚洲| 欧美国产精品久久高清| 精品久久人人做人人爽综合| 99久久www免费人成精品| 99精品久久精品| a级成人毛片久久| 免费一级欧美大片久久网 | 亚洲国产精品18久久久久久| 久久婷婷国产剧情内射白浆| 久久精品极品盛宴观看| 中文国产成人精品久久亚洲精品AⅤ无码精品| 久久久久亚洲AV无码专区首JN| 久久精品国产亚洲77777| 久久婷婷色综合一区二区| 久久亚洲欧美国产精品| 久久精品国产亚洲AV无码偷窥| 久久久久这里只有精品| 久久精品蜜芽亚洲国产AV| 日本精品久久久久影院日本 | 久久天天躁夜夜躁狠狠躁2022| 久久综合久久久| 国产精自产拍久久久久久蜜| 亚洲欧美伊人久久综合一区二区 | 精品久久久久久无码人妻热| 久久久久人妻一区精品色| 伊人久久亚洲综合影院| 国产精品无码久久综合网| 国产精品无码久久久久久| 精品无码久久久久久国产| 成人妇女免费播放久久久| 久久婷婷五月综合97色直播| 色综合久久天天综线观看| 久久国产视频99电影| 国产精品一区二区久久精品无码 |