青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

C++ Programmer's Cookbook

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

C++多線程(八)

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

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

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

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


三 代碼實例

1)使用手動的Event:當文件讀入內(nèi)存的時候,WordCount, SpellCheck,GrammarCheck可以同時進行,這里使用Event,當文件一讀入內(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)修改上面的代碼,使用自動Event,則必須在3個子線程中增加SetEvent()。且要想讓3個線程都執(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 夢在天涯 閱讀(4511) 評論(5)  編輯 收藏 引用 所屬分類: CPlusPlus

評論

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

這一系列標題寫得有誤解, 看著總有上當?shù)母杏X,
應該叫 Windows多線程 吧。  回復  更多評論   

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

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

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

建議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

導航

統(tǒng)計

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

常用鏈接

隨筆分類

隨筆檔案

收藏夾

Blogs

c#(csharp)

C++(cpp)

Enlish

Forums(bbs)

My self

Often go

Useful Webs

Xml/Uml/html

搜索

  •  

積分與排名

  • 積分 - 1811731
  • 排名 - 5

最新評論

閱讀排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
              亚洲欧美日韩精品久久久| 亚洲一二三区在线| 欧美成人精品高清在线播放| 欧美一区观看| 久久精品亚洲国产奇米99| 香蕉成人久久| 久久久久国产精品www| 久久精品二区| 欧美成va人片在线观看| 欧美日本亚洲视频| 国产精品久久久久9999| 国产精品女人毛片| 黄色一区二区在线| 日韩视频在线观看免费| 亚洲一区二区三区在线观看视频| 亚洲视频999| 久久激情五月激情| 欧美高清自拍一区| 亚洲中字黄色| 免费国产一区二区| 国产精品成人va在线观看| 国产日韩精品在线播放| 亚洲第一在线综合网站| 亚洲午夜免费视频| 欧美成年人视频网站| 亚洲免费观看视频| 久久精品国产视频| 国产精品v欧美精品v日韩精品| 国产在线视频欧美一区二区三区| 亚洲人成小说网站色在线| 欧美亚洲免费高清在线观看| 欧美a级一区| 亚洲免费影视第一页| 欧美激情视频在线免费观看 欧美视频免费一 | 国产精品入口夜色视频大尺度| 欧美三级视频在线| 国内精品美女在线观看| 这里只有精品电影| 免费观看一区| 欧美一区二区三区播放老司机 | 欧美一区二区播放| 欧美精品一区二区三区蜜桃 | 欧美片第一页| 亚洲国产成人精品久久| 欧美中文字幕在线| 99视频国产精品免费观看| 老牛影视一区二区三区| 国模一区二区三区| 久久精品国产免费看久久精品| 亚洲每日更新| 欧美日韩高清不卡| 亚洲毛片在线观看.| 欧美高清视频www夜色资源网| 亚洲欧美高清| 国产精品一区二区三区免费观看| 日韩视频免费大全中文字幕| 欧美成人午夜77777| 久久久精品视频成人| 狠狠干综合网| 免费成人小视频| 欧美69wwwcom| 在线亚洲精品| 亚洲一级影院| 国产日本欧美一区二区三区在线| 午夜精品久久99蜜桃的功能介绍| 亚洲一区国产| 国产手机视频一区二区| 久久av一区| 久久久国产精品一区二区三区| 一区福利视频| 亚洲国产精品电影在线观看| 久久久亚洲一区| 亚洲国产高清自拍| 亚洲电影免费观看高清完整版| 欧美成人蜜桃| 亚洲一区二区视频在线| 亚洲一区二区三区视频| 国产日本欧美一区二区三区在线 | 国产欧美一级| 麻豆成人在线播放| 欧美va亚洲va香蕉在线| 99re在线精品| 亚洲一区综合| 亚洲精品欧美日韩专区| 亚洲一区二区在| 亚洲美女视频在线观看| 欧美偷拍一区二区| 欧美一区二区女人| 久久精品最新地址| 在线视频中文亚洲| 欧美一区午夜精品| 亚洲日韩第九十九页| 亚洲美女啪啪| 国内精品久久久| 亚洲第一精品夜夜躁人人躁| 欧美色精品在线视频| 久久精品国产2020观看福利| 麻豆久久婷婷| 欧美在线精品免播放器视频| 老鸭窝91久久精品色噜噜导演| 在线视频精品一| 久久激情综合网| 亚洲一区二区在| 美女精品国产| 午夜日韩视频| 欧美精品久久99| 久久久免费精品视频| 欧美日韩国产一中文字不卡| 久久亚洲不卡| 国产精品美女一区二区在线观看| 免费精品视频| 国产亚洲一区二区三区在线观看| 最新精品在线| 136国产福利精品导航网址| 亚洲一区二区动漫| 99爱精品视频| 久久人人看视频| 久久久久久久久综合| 欧美色区777第一页| 欧美国产先锋| 黄色日韩精品| 性色av一区二区怡红| 亚洲自拍偷拍网址| 欧美日韩国产欧| 亚洲国内自拍| 亚洲欧洲综合另类| 久久综合综合久久综合| 久久伊人免费视频| 国产一区二区观看| 午夜日韩在线观看| 欧美亚洲在线| 国产麻豆精品视频| 亚洲免费影视| 欧美在线看片a免费观看| 国产精品女主播| 亚洲一区欧美| 久久aⅴ国产欧美74aaa| 国产日韩一区| 欧美诱惑福利视频| 老司机午夜精品视频在线观看| 国产欧美一区二区精品性 | 久久频这里精品99香蕉| 久久亚洲视频| 樱桃成人精品视频在线播放| 久久久久国产精品厨房| 欧美成年人网站| 亚洲美女色禁图| 国产精品va| 欧美一区二区免费视频| 亚洲欧美电影在线观看| 国产亚洲欧美色| 久久aⅴ国产欧美74aaa| 久久久欧美精品| 激情视频一区| 欧美激情精品久久久久久久变态| 欧美激情麻豆| 亚洲视频在线一区观看| 国产精品你懂得| 久久精品国产一区二区三区| 久久久久久夜| 91久久线看在观草草青青| 欧美成人久久| 亚洲女与黑人做爰| 老司机免费视频久久| 亚洲免费大片| 国产欧美一区二区精品忘忧草| 久久这里有精品视频| 日韩视频免费| 久久久久久91香蕉国产| 最新中文字幕亚洲| 国产欧美日韩在线视频| 久久亚洲精品一区二区| 日韩图片一区| 噜噜噜在线观看免费视频日韩| 亚洲人成欧美中文字幕| 国产精品美女久久久久久2018 | 欧美视频一区| 久久精品日韩| 一区二区三区**美女毛片| 久久精品国产免费| 亚洲性线免费观看视频成熟| 一区在线视频| 国产精品一区在线播放| 欧美精品www在线观看| 亚洲欧美在线一区二区| 亚洲人成毛片在线播放女女| 久久亚洲欧洲| 午夜精品免费视频| 亚洲美女免费精品视频在线观看| 国产色产综合色产在线视频| 欧美日韩国产大片| 久久一综合视频| 亚洲一区二区三区四区五区黄| 欧美激情一区在线| 久久另类ts人妖一区二区| 亚洲欧美国产精品va在线观看| 亚洲激情视频在线观看| 黄色成人在线网站| 国产亚洲欧美中文| 国产日韩欧美夫妻视频在线观看|