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

C++ Programmer's Cookbook

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

C++多線程(八)

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

        事件能夠通知一個操作已經完成。有兩種不同類型的事件對象。一種是人工重置的事件,另一種是自動重置的事件。當人工重置的事件得到通知時,等待該事件的所有線程均變為可調度線程。當一個自動重置的事件得到通知時,等待該事件的線程中只有一個線程變為可調度線程。

        當一個線程執行初始化操作,然后通知另一個線程執行剩余的操作時,事件使用得最多。事件初始化為未通知狀態,然后,當該線程完成它的初始化操作后,它就將事件設置為已通知狀態。這時,一直在等待該事件的另一個線程發現該事件已經得到通知,因此它就變成可調度線程。

         Microsoft為自動重置的事件定義了應該成功等待的副作用規則,即當線程成功地等待到該對象時,自動重置的事件就會自動重置到未通知狀態。這就是自動重置的事件如何獲得它們的名字的方法。通常沒有必要為自動重置的事件調用ResetEvent函數,因為系統會自動對事件進行重置。但是,Microsoft沒有為人工重置的事件定義成功等待的副作用,所以需要調用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:當文件讀入內存的時候,WordCount, SpellCheck,GrammarCheck可以同時進行,這里使用Event,當文件一讀入內存就通知WordCount,SpellCheck和GrammarCheck線程開始執行。
#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個線程都執行完,必須的增加Waitfor()函數。

#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 漂舟

這一系列標題寫得有誤解, 看著總有上當的感覺,
應該叫 Windows多線程 吧。  回復  更多評論   

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

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

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

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

導航

統計

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

常用鏈接

隨筆分類

隨筆檔案

收藏夾

Blogs

c#(csharp)

C++(cpp)

Enlish

Forums(bbs)

My self

Often go

Useful Webs

Xml/Uml/html

搜索

  •  

積分與排名

  • 積分 - 1814985
  • 排名 - 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>
              国产精自产拍久久久久久| 国产麻豆91精品| 久久综合伊人77777| 国产精品一区二区三区成人| 欧美激情五月| 欧美专区在线| 欧美激情第10页| 欧美亚洲午夜视频在线观看| 经典三级久久| 欧美精品色网| 久久久亚洲高清| 亚洲第一视频网站| 国产女主播一区| 欧美第一黄色网| 香蕉尹人综合在线观看| 欧美国产日韩一区二区| 欧美黄色免费网站| 亚洲精品小视频| 欧美韩日视频| 99视频精品| 亚洲人成欧美中文字幕| 欧美日韩在线亚洲一区蜜芽| 欧美自拍偷拍| 蜜桃精品久久久久久久免费影院| 亚洲一区二区三区在线看 | 久久久久久自在自线| 猫咪成人在线观看| 亚洲精品一区二区三区婷婷月| 午夜精品99久久免费| 一区二区欧美亚洲| 亚洲精品一区二区三区樱花 | 老牛嫩草一区二区三区日本| 亚洲日本va在线观看| 久久亚洲春色中文字幕| 亚洲视屏一区| 一区二区三区精品| 久久尤物视频| 国产精品一区二区在线观看不卡| 亚洲夫妻自拍| 亚洲精美视频| 亚洲国产精品一区在线观看不卡| 99这里只有久久精品视频| 亚洲精品一区二区三区婷婷月 | 欧美视频免费在线| 亚洲成人中文| 久久久久9999亚洲精品| 久久精品首页| 久久久久久久一区二区| 亚洲欧洲免费视频| 久久午夜精品一区二区| 久久久www成人免费无遮挡大片| 亚洲福利在线视频| 亚洲日本成人网| 欧美一区日韩一区| 久久午夜视频| 国产一区二区三区无遮挡| 影音先锋日韩资源| 日韩天堂在线观看| 中文一区二区| 国产精品丝袜久久久久久app| 国产精品久久久久久久久借妻 | 国产精品一区二区三区成人| 日韩小视频在线观看专区| 免费不卡中文字幕视频| 老牛嫩草一区二区三区日本| 中文网丁香综合网| 午夜精品www| 久久精品系列| 亚洲欧美日韩在线高清直播| 欧美日韩精品欧美日韩精品一| 国产精品国产三级国产专播精品人 | 精品动漫一区| 美日韩在线观看| 久久午夜国产精品| 亚洲精品久久久久久一区二区 | 一本久久综合| 亚洲毛片一区二区| 欧美性感一类影片在线播放| 国产专区综合网| 亚洲人成网站在线播| 欧美大片在线观看一区| 亚洲一区二区三区四区五区午夜 | 亚洲男女自偷自拍| 欧美.www| 国产一区二区av| 久久人人爽爽爽人久久久| 欧美伊人久久久久久午夜久久久久 | 亚洲特级片在线| 国产日韩欧美视频| 夜夜爽www精品| 亚洲最快最全在线视频| 国产精品一区二区三区久久| 欧美亚洲尤物久久| 久久天堂av综合合色| 这里只有精品电影| 亚洲福利视频二区| 欧美日韩在线观看视频| 亚洲国产一区二区视频| 亚洲一级黄色片| 欧美jizzhd精品欧美巨大免费| 夜夜狂射影院欧美极品| 国产精品网曝门| 欧美福利一区二区三区| 欧美午夜久久久| 夜夜嗨av色一区二区不卡| 国产情人综合久久777777| 久久青草久久| 欧美日韩在线播放一区二区| 麻豆亚洲精品| 国产精品日韩| 亚洲色图综合久久| 久久婷婷国产麻豆91天堂| 一本色道久久99精品综合| 亚洲欧美bt| av不卡免费看| 亚洲午夜在线| 伊人成人在线视频| 久久久久国产成人精品亚洲午夜| 乱人伦精品视频在线观看| 一区二区三区鲁丝不卡| 久久免费视频这里只有精品| 亚洲视频二区| 欧美激情一区二区三区不卡| 久久久久久一区二区三区| 欧美视频在线观看一区| 欧美成人一区二免费视频软件| 国产免费观看久久黄| 亚洲区第一页| 亚洲人体影院| 蜜臀av国产精品久久久久| 久久精品网址| 国产亚洲成精品久久| 久久久水蜜桃| 国产一区二区按摩在线观看| 亚洲一区区二区| 亚洲砖区区免费| 性久久久久久久久久久久| 在线视频日韩| 欧美日韩第一页| 亚洲黄网站在线观看| 亚洲国产成人av好男人在线观看| 性做久久久久久免费观看欧美| 亚洲午夜精品17c| 欧美女同视频| 欧美一区在线视频| 久久蜜臀精品av| 久热综合在线亚洲精品| 国产一二精品视频| 欧美一区二区三区在线| 久久电影一区| 欧美丰满少妇xxxbbb| 亚洲欧美国产不卡| 蜜臀av性久久久久蜜臀aⅴ四虎| 巨乳诱惑日韩免费av| 一区二区三区在线不卡| 久久久久久久久久久成人| 麻豆91精品91久久久的内涵| 国内视频一区| 欧美a级片一区| 日韩亚洲不卡在线| 国产精品一区二区三区久久| 亚洲欧美日韩一区二区三区在线观看 | 久久久九九九九| 激情六月婷婷综合| 男人的天堂亚洲在线| 亚洲国产高潮在线观看| 欧美人妖在线观看| 亚洲在线成人| 老司机一区二区三区| 亚洲精品一区中文| 久久爱另类一区二区小说| 99精品欧美一区二区三区综合在线 | 欧美日韩免费观看一区| 亚洲视频一二区| 久久伊伊香蕉| 宅男精品视频| 狠狠色综合网| 亚洲男人天堂2024| 男人的天堂亚洲在线| 一本大道久久精品懂色aⅴ| 欧美性做爰猛烈叫床潮| 久久精品夜夜夜夜久久| 久久福利影视| 亚洲精选在线| 国产一区二区三区不卡在线观看| 久久婷婷丁香| 亚洲四色影视在线观看| 奶水喷射视频一区| 午夜精品99久久免费| 亚洲第一久久影院| 国产精品美女久久久| 亚洲国产精品第一区二区三区| 欧美国产精品专区| 在线亚洲免费| 欧美激情精品久久久久久免费印度| 亚洲一区免费| 日韩图片一区| 亚洲国产成人porn| 国产一区二区在线观看免费播放| 欧美母乳在线|