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

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>
              国产精品久久久久婷婷| 亚洲欧美日韩人成在线播放| 99国产精品久久久| 亚洲精品永久免费| 亚洲裸体视频| 亚洲线精品一区二区三区八戒| 亚洲精品欧美日韩专区| 亚洲激情成人网| 亚洲理伦在线| 篠田优中文在线播放第一区| 久久久午夜视频| 欧美成人自拍视频| 亚洲人成久久| 一本一本久久a久久精品综合妖精 一本一本久久a久久精品综合麻豆 | 亚洲一区二区三区精品在线观看| 宅男精品视频| 久久国产欧美| 亚洲国产导航| 亚洲一区在线视频| 久热精品视频在线观看一区| 欧美日产在线观看| 狠狠综合久久| 亚洲欧美激情视频在线观看一区二区三区| 久久精品国产免费| 一本色道久久综合狠狠躁的推荐| 欧美影院午夜播放| 欧美日韩亚洲一区三区| 黄网动漫久久久| 亚洲欧美另类综合偷拍| 欧美福利小视频| 午夜一级久久| 欧美色欧美亚洲另类二区| 伊人久久大香线| 亚洲欧美日韩精品久久奇米色影视| 久久亚裔精品欧美| 在线综合+亚洲+欧美中文字幕| 久久这里只有精品视频首页| 国产视频久久| 亚洲在线成人| 亚洲欧洲日韩女同| 久久久久久久999精品视频| 国产精品av一区二区| 最新亚洲一区| 欧美高清成人| 久久久人成影片一区二区三区| 国产精品美女在线观看| 一本色道久久综合亚洲二区三区| 久久五月激情| 欧美亚洲视频| 国产亚洲精品v| 新67194成人永久网站| 亚洲免费观看高清完整版在线观看| 在线一区亚洲| 亚洲国产mv| 一卡二卡3卡四卡高清精品视频| 国产一区清纯| 亚洲综合精品一区二区| 欧美承认网站| 久久裸体艺术| 国产亚洲va综合人人澡精品| 亚洲男人的天堂在线观看| 亚洲久久在线| 欧美日韩精品二区| 亚洲一级黄色| 宅男噜噜噜66一区二区66| 欧美精品激情blacked18| 91久久精品国产91久久性色tv| 久久综合狠狠| 亚洲高清免费在线| 激情综合久久| 免费亚洲电影在线| 久久在线免费观看视频| 亚洲大黄网站| 欧美福利视频在线| 欧美大片在线观看一区| 99视频有精品| 亚洲欧美日韩国产中文| 国产一区再线| 亚洲国产成人在线视频| 欧美国产精品一区| 中文一区二区| 欧美一区二区国产| 亚洲国产精品传媒在线观看| 亚洲精品一二| 国产精品激情| 麻豆精品视频| 欧美精品在线播放| 亚洲欧美日韩一区二区| 性欧美xxxx大乳国产app| 在线观看亚洲精品| 亚洲精品国产精品乱码不99| 国产精品久久久免费| 久久久www成人免费精品| 久久综合狠狠综合久久综合88 | 欧美激情 亚洲a∨综合| 亚洲综合电影| 久久免费视频网站| 亚洲视频国产视频| 久久免费精品日本久久中文字幕| 亚洲精品视频在线观看网站| 亚洲一区二区三区久久| 亚洲第一色在线| 亚洲视频专区在线| 亚洲肉体裸体xxxx137| 午夜精品久久久久久久99水蜜桃| 亚洲精品日产精品乱码不卡| 欧美一级专区| 亚洲性夜色噜噜噜7777| 免费成人在线观看视频| 欧美在线一区二区三区| 欧美日韩在线第一页| 欧美成va人片在线观看| 国产欧美一区二区精品秋霞影院| 亚洲电影欧美电影有声小说| 国产亚洲一区二区在线观看| 99精品热视频| 亚洲精品韩国| 久久中文在线| 久久久在线视频| 国产欧美另类| 亚洲网友自拍| 亚洲欧美一区二区激情| 欧美精品三级| 亚洲激情六月丁香| 亚洲欧洲中文日韩久久av乱码| 欧美综合77777色婷婷| 西瓜成人精品人成网站| 欧美精品一区二区高清在线观看| 美女网站在线免费欧美精品| 国产香蕉久久精品综合网| 亚洲综合二区| 一区三区视频| 亚洲小少妇裸体bbw| 久久久亚洲国产美女国产盗摄| 夜夜夜精品看看| 欧美激情国产日韩| 亚洲福利视频一区| 亚洲国内高清视频| 欧美激情aaaa| 99re66热这里只有精品3直播| 一二三四社区欧美黄| 欧美日韩国产经典色站一区二区三区| 欧美大片免费久久精品三p | 欧美在线观看天堂一区二区三区| 欧美一区国产二区| 国产一区二区三区在线观看免费视频 | 久久久综合视频| 亚洲激情在线观看| 欧美在线亚洲在线| 久久久伊人欧美| 亚洲免费福利视频| 一区二区三区你懂的| 欧美一激情一区二区三区| 99国产一区二区三精品乱码| 久久精品最新地址| 欧美在线观看视频在线| 欧美小视频在线| 亚洲久久一区| 99精品福利视频| 久久久高清一区二区三区| 国产精品久久久久久久久久久久| 亚洲国产精品悠悠久久琪琪| 在线精品国产欧美| 久久亚洲欧美国产精品乐播| 久久久久久久综合日本| 在线观看视频一区二区| 欧美日韩色婷婷| 欧美一区二区三区在线观看| 欧美韩日高清| 亚洲欧美综合一区| 亚洲国产日韩欧美| 国产精品久久久久久久电影| 久久久www| 一本色道久久综合狠狠躁篇怎么玩| 午夜久久福利| 亚洲精品久久久蜜桃| 国产精品外国| 欧美国产欧美亚洲国产日韩mv天天看完整 | 国内精品久久久久影院 日本资源 国内精品久久久久伊人av | 亚洲高清不卡av| 欧美日韩中文| 久久国产精品99久久久久久老狼 | 亚洲精品社区| 国产精品自拍小视频| 免费久久99精品国产| 99在线|亚洲一区二区| 男同欧美伦乱| 亚洲欧美一区二区三区极速播放| 在线观看一区二区视频| 国产精品视频xxx| 欧美日韩岛国| 久久综合狠狠综合久久激情| 亚洲性视频网址| 亚洲人线精品午夜| 免费成年人欧美视频| 午夜视频一区| 亚洲一二区在线| 一区二区电影免费观看| 亚洲高清免费在线| 国内久久精品|