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

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>
              国产日韩精品一区二区三区| 免费看亚洲片| 国产精品免费区二区三区观看| 亚洲欧美日韩中文视频| 亚洲人成网站999久久久综合| 亚洲视频播放| 欧美亚洲一区| 久久婷婷国产麻豆91天堂| 免费观看一区| 欧美电影在线观看| 亚洲国产精品ⅴa在线观看| 久久九九99| 欧美sm重口味系列视频在线观看| 久久久久久电影| 亚洲小说区图片区| 羞羞漫画18久久大片| 亚洲欧美一区二区原创| 一区二区三区视频在线播放| 欧美激情日韩| 99精品福利视频| 一区二区高清视频| 国产精品久久久久一区二区三区共| 久久精品国产一区二区三区| 91久久久国产精品| 欧美日韩1区2区3区| 欧美夜福利tv在线| 午夜欧美大尺度福利影院在线看 | 欧美久久一级| 亚洲淫片在线视频| 欧美激情一区二区三区| 亚洲韩国青草视频| 久久国产精品色婷婷| 欧美激情精品久久久久久免费印度| 99精品免费网| 国模套图日韩精品一区二区| 久久青草久久| 亚洲九九爱视频| 免费成人毛片| 亚洲三级视频| 一本色道久久88综合亚洲精品ⅰ| 亚洲大胆人体在线| 亚洲精品综合精品自拍| 亚洲激情影视| 亚洲福利小视频| 亚洲激情图片小说视频| 久久av最新网址| 久久国产毛片| 99re66热这里只有精品4| 亚洲少妇诱惑| 亚洲第一精品在线| 亚洲精品国产精品乱码不99| 夜夜爽av福利精品导航| 日韩一二三在线视频播| 亚洲毛片播放| 一本色道久久综合亚洲精品高清 | 亚洲少妇自拍| 欧美三级电影一区| 亚洲欧美经典视频| 亚洲私人影院| 亚洲国产aⅴ天堂久久| 欧美国产精品中文字幕| 久久亚洲私人国产精品va媚药| 国产欧美精品一区| 欧美va亚洲va日韩∨a综合色| 欧美激情一区二区三区在线视频 | 亚洲国产精品va在线看黑人| 亚洲图片你懂的| 亚洲美女色禁图| 欧美不卡激情三级在线观看| 久久精品视频va| 国产一区二区三区网站| 午夜精品视频网站| 亚洲综合色视频| 欧美视频亚洲视频| 99亚洲一区二区| 亚洲无限av看| 国产精品国产福利国产秒拍| 亚洲人体1000| 亚洲精品小视频| 欧美精品videossex性护士| 欧美成人精品福利| 9i看片成人免费高清| 欧美日韩一区综合| 亚洲综合欧美日韩| 久久综合福利| 亚洲一区二区成人| 国产精品美女久久久| 午夜一区在线| 亚洲激情一区二区三区| 亚洲一区免费看| 好看的日韩视频| 久久嫩草精品久久久精品| 国产一区在线免费观看| 久久国产精品99国产精| 欧美18av| 亚欧成人精品| 雨宫琴音一区二区在线| 久久五月婷婷丁香社区| 亚洲一卡久久| 99精品国产高清一区二区| 亚洲午夜高清视频| 亚洲成色精品| 国产精品毛片在线看| 欧美日韩国产首页在线观看| 久久国产精品一区二区| aa级大片欧美三级| 91久久夜色精品国产九色| 久久xxxx| 久久av一区二区| 久久精品国产69国产精品亚洲| 99av国产精品欲麻豆| 91久久国产综合久久蜜月精品 | 夜夜躁日日躁狠狠久久88av| 性欧美精品高清| 久久久久久久久久久久久女国产乱| 亚洲狠狠丁香婷婷综合久久久| 久久香蕉国产线看观看网| 久久国产99| 快播亚洲色图| 亚洲国产成人91精品| 最新亚洲视频| 亚洲午夜免费福利视频| 亚洲欧美日韩在线不卡| 亚洲欧美日韩第一区| 久久精品国产一区二区电影| 久久成人国产精品| 欧美黄色网络| 国产亚洲欧美另类一区二区三区| 黄色成人片子| 欧美极品在线播放| 欧美午夜片在线观看| 国产区二精品视| 亚洲国产欧美日韩| 欧美淫片网站| 99国产精品自拍| 噜噜噜91成人网| 国产精品毛片a∨一区二区三区|国 | 亚洲欧美久久久| 久久综合伊人| 国产日韩精品久久久| 亚洲综合色在线| 99国产精品久久久久久久久久| 9i看片成人免费高清| 欧美在线视频日韩| 99re66热这里只有精品3直播| 久久本道综合色狠狠五月| 欧美亚州一区二区三区| 夜夜躁日日躁狠狠久久88av| 欧美高清在线视频| 久久香蕉精品| 亚洲国产三级网| 欧美电影免费观看| 久久久久久久欧美精品| 伊人久久婷婷| 免费不卡在线观看| 久久久精品视频成人| 黄色一区二区在线| 狂野欧美一区| 欧美1区2区视频| 亚洲精品国精品久久99热| 亚洲国产精品va在线看黑人动漫| 久久久人成影片一区二区三区观看| 国产一区二区三区电影在线观看| 午夜精品久久久久久久久| 午夜精品久久久久久久99水蜜桃| 亚洲影院色无极综合| 国产精品日韩在线播放| 久久精品国语| 欧美激情偷拍| 久久成人在线| 欧美另类videos死尸| 亚洲欧美另类在线观看| 欧美一区二区私人影院日本| 亚洲第一在线视频| 99亚洲一区二区| 国产在线拍偷自揄拍精品| 欧美激情亚洲精品| 国产精品久久久久天堂| 亚洲国产一区二区视频| 国产日韩欧美在线看| 亚洲激情影视| 亚洲美女电影在线| 久久久国产视频91| 亚洲午夜一二三区视频| 欧美黄色aaaa| 欧美sm极限捆绑bd| 国内成人在线| 久久av一区二区三区漫画| 欧美一区二区啪啪| 国产精品素人视频| 亚洲狼人综合| 亚洲伦理精品| 欧美成人精品在线观看| 亚洲国产国产亚洲一二三| 亚洲第一网站| 欧美精品1区2区3区| 亚洲日本乱码在线观看| 99精品欧美一区| 国产精品sm| 午夜精品亚洲|