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

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)完成。有兩種不同類(lèi)型的事件對(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線程開(kāi)始執(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)在天涯 閱讀(4513) 評(píng)論(5)  編輯 收藏 引用 所屬分類(lèi): CPlusPlus

評(píng)論

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

這一系列標(biāo)題寫(xiě)得有誤解, 看著總有上當(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

常用鏈接

隨筆分類(lèi)

隨筆檔案

收藏夾

Blogs

c#(csharp)

C++(cpp)

Enlish

Forums(bbs)

My self

Often go

Useful Webs

Xml/Uml/html

搜索

  •  

積分與排名

  • 積分 - 1812980
  • 排名 - 5

最新評(píng)論

閱讀排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
              国产一区免费视频| 欧美成人蜜桃| 最近看过的日韩成人| 欧美成人精品在线观看| 亚洲无限乱码一二三四麻| 久久久7777| 亚洲一区二区三区四区视频| 国产精品久久久久av| 欧美激情亚洲激情| 亚洲综合国产精品| 国产精品午夜久久| 亚洲欧美久久久久一区二区三区| 亚洲精品久久久久久久久久久久久 | 亚洲精品欧洲| 欧美aⅴ一区二区三区视频| 亚洲国产精品一区二区第一页 | 欧美成人a视频| 久久国产主播| 免费成人毛片| 免费观看30秒视频久久| 亚洲精品日韩综合观看成人91| 欧美精品18videos性欧美| 亚洲欧美电影在线观看| 久久本道综合色狠狠五月| 伊人成年综合电影网| 麻豆精品精品国产自在97香蕉| 欧美国产精品中文字幕| 亚洲一区二区视频| 一区二区久久久久| 久久久久免费| 亚洲麻豆视频| 国产一区二区三区日韩| 欧美午夜不卡在线观看免费| 久久久久久久久久久久久女国产乱| 亚洲一区二区四区| 美腿丝袜亚洲色图| 久久久久91| 欧美精品一区二区三区蜜臀 | 一区二区三区精密机械公司 | 美女日韩欧美| 国产日韩一级二级三级| 欧美阿v一级看视频| 亚洲图片欧美一区| 亚洲精品日韩久久| 亚洲人午夜精品| 久久久水蜜桃| 亚洲作爱视频| 亚洲九九爱视频| 亚洲精品乱码久久久久| 亚洲免费精品| 亚洲人成网站色ww在线| 欧美在线视频导航| 欧美激情欧美激情在线五月| 亚洲校园激情| 久久久久久久久久久一区| 欧美激情女人20p| 国产精品麻豆成人av电影艾秋| 国产精品一区免费视频| 久久爱www.| 亚洲视频图片小说| 日韩一区二区精品葵司在线| 久久久久久久高潮| 久久只精品国产| 亚洲视频1区| 性欧美办公室18xxxxhd| 国产欧美日韩| 久久精品欧美日韩| 玖玖国产精品视频| 一级成人国产| 欧美韩日高清| 亚洲成人资源网| 你懂的国产精品| 欧美日韩国产123| 国产一区二区三区精品久久久| 国产综合色产在线精品| 性娇小13――14欧美| 欧美成人综合一区| 久久亚洲精品一区二区| 伊人成综合网伊人222| 亚洲一区日韩在线| 午夜日韩av| 亚洲小少妇裸体bbw| 国产精品久久久久久av下载红粉| 亚洲欧洲日本国产| 中国亚洲黄色| 国产一区二区三区的电影| 亚洲资源在线观看| 亚洲欧洲另类| 性色av一区二区三区在线观看 | 久久精品国产69国产精品亚洲| 久久夜色精品国产噜噜av| 亚洲欧美日韩视频二区| 久久性天堂网| 欧美成人一区二区三区片免费| 99成人在线| 亚洲视频导航| 国内揄拍国内精品少妇国语| 日韩视频专区| 午夜精品国产精品大乳美女| 久久亚洲精选| 欧美福利在线观看| 久久精品天堂| 欧美成人国产| 亚洲欧美日本日韩| 久久久青草青青国产亚洲免观| 亚洲影院免费观看| 欧美日韩三区四区| 亚洲欧美日韩精品| 欧美韩国在线| 日韩视频一区二区三区| 在线不卡亚洲| 欧美精品高清视频| 麻豆91精品| 亚洲一级黄色| 久久精品日产第一区二区| 欧美主播一区二区三区美女 久久精品人| 亚洲精品乱码久久久久久黑人 | 在线观看亚洲精品视频| 久久精品卡一| 一本大道久久a久久精品综合 | 亚洲国产精品综合| 午夜亚洲激情| 久久久精品国产免大香伊| 黄色国产精品一区二区三区| 欧美寡妇偷汉性猛交| 亚洲夜间福利| 狠狠色综合日日| 开心色5月久久精品| 夜夜嗨av一区二区三区中文字幕 | 99综合在线| 欧美美女操人视频| 99热免费精品| 久久综合九色99| 一区二区三区精品视频在线观看| 在线精品视频一区二区三四| 欧美高清在线播放| 国外成人性视频| 欧美高清视频一区| 欧美一区二区高清| 日韩一级大片| 久久精品二区三区| 最新亚洲视频| 一区二区三区视频在线看| 欧美成人官网二区| 先锋影音国产精品| 亚洲欧美日韩高清| 亚洲精品影院| 亚洲欧洲日韩在线| 精品二区视频| 国外成人免费视频| 黄色成人91| 日韩视频在线播放| 欧美性感一类影片在线播放 | 在线综合+亚洲+欧美中文字幕| 激情久久影院| 亚洲精品社区| 亚洲国产成人精品久久久国产成人一区 | 欧美日韩三级电影在线| 欧美午夜性色大片在线观看| 亚洲第一黄色| 欧美成人一区二区三区在线观看| 亚洲国产专区| 欧美va天堂| 狠狠色2019综合网| 亚洲精品四区| 日韩亚洲一区在线播放| 欧美亚洲视频| 欧美激情国产日韩精品一区18| 亚洲精品免费看| 欧美一区二区啪啪| 国产精品成人v| 久久久高清一区二区三区| 欧美色视频日本高清在线观看| 国产精品久久久久毛片大屁完整版| 亚洲黄网站在线观看| 午夜精品成人在线| 宅男噜噜噜66一区二区66| 久久成人精品无人区| 欧美手机在线视频| 亚洲狼人精品一区二区三区| 亚洲欧美成人一区二区三区| 亚洲国产mv| 久久在线免费观看| 亚洲黄网站黄| 欧美激情第4页| 欧美日韩国产色视频| 国产欧美一区二区精品性 | 久久久99久久精品女同性| 欧美日韩91| 亚洲一区二区在线播放| 亚洲伊人色欲综合网| 国产欧美日韩三区| 欧美一区二区视频在线观看| 日韩一级精品| 国产亚洲成精品久久| 黄色在线一区| 亚洲欧美日本国产专区一区| 欧美中文在线观看国产| 一区二区三区在线视频播放| 一区二区欧美日韩|