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

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 夢在天涯 閱讀(4517) 評論(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

搜索

  •  

積分與排名

  • 積分 - 1816188
  • 排名 - 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精品视频免费观看视频| 99精品国产热久久91蜜凸| 久久gogo国模啪啪人体图| 国产精品女主播一区二区三区| 亚洲欧美精品在线观看| 亚洲美女啪啪| 亚洲欧洲另类国产综合| 欧美aⅴ99久久黑人专区| 亚洲成色777777在线观看影院| 久久久精品tv| 欧美一级播放| 国产一区二区成人久久免费影院| 欧美综合77777色婷婷| 亚洲欧美日韩一区二区在线 | 欧美一区二区三区视频免费播放| 国产精品国产福利国产秒拍| 亚洲小说区图片区| 亚洲一本视频| 国产日韩在线亚洲字幕中文| 久久精品亚洲热| 久久黄金**| 在线成人h网| 亚洲第一综合天堂另类专| 欧美jizzhd精品欧美巨大免费| 精品成人国产| 欧美国产高潮xxxx1819| 欧美国产亚洲精品久久久8v| 亚洲欧美日韩一区二区三区在线观看 | 毛片基地黄久久久久久天堂| 蜜桃久久av| 久久这里只有| 亚洲视频中文字幕| 久久野战av| 亚洲小说欧美另类社区| 欧美日韩成人精品| 一区二区三区视频在线播放| 欧美丝袜一区二区| 性欧美在线看片a免费观看| 亚洲嫩草精品久久| 国内自拍一区| 欧美高清不卡在线| 欧美精品黄色| 亚洲欧美日韩在线高清直播| 欧美怡红院视频一区二区三区| 伊人成人网在线看| 亚洲国产成人午夜在线一区| 欧美性事免费在线观看| 欧美一区免费视频| 卡一卡二国产精品| 中文亚洲视频在线| 欧美在线二区| 99在线精品视频| 亚洲欧美成人一区二区三区| …久久精品99久久香蕉国产| 亚洲电影在线看| 国产精品毛片a∨一区二区三区| 久久成人免费视频| 欧美大片第1页| 亚洲砖区区免费| 久久精品成人| 亚洲欧洲三级| 亚洲午夜精品久久久久久浪潮| 国产一区91| 性欧美1819性猛交| 久久免费高清| 亚洲性线免费观看视频成熟| 亚洲欧美一区在线| 亚洲电影第1页| 99综合电影在线视频| 国产欧美日韩另类视频免费观看| 亚洲二区免费| 国产日韩欧美精品一区| 亚洲国产欧美一区| 国产欧美视频在线观看| 亚洲电影下载| 国语精品中文字幕| 亚洲人成人一区二区三区| 国产日韩欧美a| 91久久香蕉国产日韩欧美9色| 国产女同一区二区| 亚洲精品国产精品乱码不99按摩 | 一区二区三区欧美激情| 亚洲精品久久久久中文字幕欢迎你 | 久久av免费一区| 久久成人国产精品| 亚洲国产一二三| 亚洲韩国精品一区| 亚洲图片欧洲图片日韩av| 亚洲第一精品夜夜躁人人爽| 亚洲午夜伦理| 一本色道久久88综合日韩精品 | 狠狠色丁香婷综合久久| 一本色道久久综合亚洲91| 1000精品久久久久久久久 | 夜夜精品视频| 老牛嫩草一区二区三区日本| 欧美在线观看天堂一区二区三区| 免费中文日韩| 鲁大师成人一区二区三区| 国产精品看片你懂得| 亚洲国产高清自拍| 狠狠色丁香婷婷综合| 午夜日韩在线| 亚洲小说欧美另类社区| 欧美激情中文字幕一区二区| 蜜臀av国产精品久久久久| 国产女优一区| 亚洲网站在线播放| 亚洲免费精品| 嫩草国产精品入口| 美女任你摸久久| 国内成+人亚洲| 亚洲欧美日韩人成在线播放| 在线中文字幕一区| 欧美激情一区二区三区| 老**午夜毛片一区二区三区| 国产日韩精品在线| 亚洲一区国产视频| 亚洲影院在线观看| 国产精品av久久久久久麻豆网| 亚洲精品久久久久久久久久久久| 91久久国产综合久久| 久久一区二区三区超碰国产精品| 欧美在线免费视屏| 国产伦理一区| 午夜精品久久久久影视| 亚洲午夜国产一区99re久久| 欧美伦理视频网站| 亚洲精品乱码久久久久久按摩观| 亚洲国产毛片完整版| 久久人人97超碰精品888| 另类酷文…触手系列精品集v1小说| 国产一区二区三区久久 | 欧美在线看片| 老司机成人网| 欧美激情中文字幕在线| 国产精品99久久久久久久女警 | 亚洲免费观看高清完整版在线观看熊 | 欧美日韩免费精品| 亚洲精品一区二| 亚洲三级影院| 亚洲经典三级| 欧美激情久久久| 免费成人黄色av| 亚洲国产三级| 久久深夜福利| 美玉足脚交一区二区三区图片| 狠狠色香婷婷久久亚洲精品| 亚洲精品社区| 欧美一区1区三区3区公司| 国产精品美女xx| 亚洲一区二区视频| 久久av资源网| 激情综合网激情| 欧美成人xxx| 亚洲激情偷拍| 亚洲在线观看视频| 国产欧美一区二区精品仙草咪| 欧美一区二区三区视频| 牛人盗摄一区二区三区视频| 亚洲日韩第九十九页| 欧美精品一区二区精品网| 亚洲视频在线观看三级| 欧美一区二区日韩| 国产一区二区三区久久精品| 久久久亚洲国产天美传媒修理工 | 国产精品久久久久aaaa九色| 午夜欧美视频| 午夜精品一区二区三区在线视 | 亚洲人成网站精品片在线观看| 亚洲视频精选| 国产精品免费小视频| 欧美在线观看一区| 亚洲高清视频中文字幕| 在线亚洲一区| 国产一区二区0| 欧美高清在线视频| 日韩一本二本av| 久久久久国产免费免费| 亚洲风情在线资源站| 欧美日韩一卡二卡| 欧美中文字幕在线播放| 欧美不卡福利| 午夜精品久久久久影视| 国内免费精品永久在线视频| 麻豆成人精品| 一区二区三区四区五区在线| 久久精品国产亚洲5555| 亚洲日本一区二区| 欧美区亚洲区| 先锋影音网一区二区| 亚洲电影中文字幕| 欧美一区日本一区韩国一区| 亚洲国产另类久久久精品极度| 国产精品v欧美精品v日本精品动漫 | 亚洲自拍三区| 亚洲国产欧美日韩精品| 久久激情一区| 久久香蕉精品| 久久国产精品72免费观看|