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

我住包子山

this->blog.MoveTo("blog.baozishan.in")

翻譯一篇文章Introduction to Multi-threaded Code 多線程編程的一些代碼 已經(jīng)全譯好了

Someone recently asked me what I recommend for synchronizing worker threads and I suggested setting an event. This person's response was that you could not do that since worker threads do not support a message pump (UI threads are required to support messages). The confusion here is that events and messages are different animals under windows.

我忘記了我從哪里copy的這些例子代碼,他們可是非常簡單而有趣的。如果有人知道這些代碼的作者,我一定要好好感謝你和這位作者。

注意這里有很多對于沒有提及的MFC的支持。像_beginthread(一個C運(yùn)行時(shí)庫調(diào)用)的API可以在MFC應(yīng)用程序中替換成AfxBeginThread

無同步(No Synchronization)

這第一個例子描述了兩個互不同步的線程。進(jìn)程中的首要線程--主函數(shù)循環(huán),輸出全局整形數(shù)組的內(nèi)容。還有一個線程“Thread”不停的給數(shù)組每個元素+1。
?The thread called "Thread" continuously populates the global array of integers.

				  #include <process.h>
				  #include <stdio.h>
				int a[ 5 ];
  
  void Thread( void* pParams )
  { int i, num = 0;
  
    while ( 1 )
    { 
       for ( i = 0; i < 5; i++ ) a[ i ] = num;
       num++;
    }
  }
  
  int main( void )
  { 
     _beginthread( Thread, 0, NULL );
  
     while( 1 )
        printf("%d %d %d %d %d\n", 
               a[ 0 ], a[ 1 ], a[ 2 ],
               a[ 3 ], a[ 4 ] );
  
   return0;
  }

注意這個例子的輸出,紅色的數(shù)處在一個主線程搶先于Thread工作過程中執(zhí)行的打印動作

81751652 81751652 81751651 81751651 81751651
81751652 81751652 81751651 81751651 81751651
83348630 83348630 83348630 83348629 83348629
83348630 83348630 83348630 83348629 83348629
83348630 83348630 83348630 83348629 83348629

?

關(guān)鍵區(qū)域/臨界區(qū)域 對象(Critical Section Objects)

如果你想讓主線程等待Thread線程處理好全局?jǐn)?shù)組再做打印,一種解決方法是使用關(guān)鍵區(qū)域?qū)ο蟆?br />關(guān)鍵區(qū)域對象提供同步于使用互斥器(Mutex)對象很相似, 除了關(guān)鍵區(qū)域?qū)ο笾茉谝粋€進(jìn)程內(nèi)發(fā)揮效用。Event, mutex,?以及 semaphore?對象也可以用在單進(jìn)程的應(yīng)用程序中, 但是關(guān)鍵區(qū)域?qū)ο筇峁┮粋€相對快捷更加高效的同步機(jī)制. 就像互斥器一樣, 一個關(guān)鍵區(qū)域?qū)ο笾荒芡瑫r(shí)被一個線程擁有, 這個關(guān)鍵區(qū)域能夠在同時(shí)發(fā)生的數(shù)據(jù)存取時(shí)保護(hù)共享資源. 獲取關(guān)鍵區(qū)域的先后順序不定,可是不用太擔(dān)心,系統(tǒng)對于每一個線程都是平等的。

???  
  CRITICAL_SECTION cs;
  int a[ 5 ];
  
  void Thread( void* pParams )
  {
    int i, num = 0;
  
    while ( TRUE )
    {
       EnterCriticalSection( &cs );
       for ( i = 0; i < 5; i++ ) a[ i ] = num;
       LeaveCriticalSection( &cs );
       num++;
    }
  }
  
  int main( void )
{ InitializeCriticalSection( &cs ); _beginthread( Thread, 0, NULL ); while( TRUE ) { EnterCriticalSection( &cs ); printf( "%d %d %d %d %d\n", a[ 0 ], a[ 1 ], a[ 2 ], a[ 3 ], a[ 4 ] ); LeaveCriticalSection( &cs ); } return 0; }

If you are running Windows 9x/NT/2000, you can run this program by clicking here.

互斥器(Mutex Objects)

一個互斥器是一個信號狀態(tài)的同步對象,當(dāng)它不屬于任何一個線程時(shí)就用信號來體現(xiàn),當(dāng)被擁有時(shí)他的信號狀態(tài)就為None. 同一時(shí)刻只有一個線程可以擁有互斥器, 互斥器這個名字來自于他們對于并列的線程存取共享資源時(shí)表現(xiàn)出的行為。舉個例子,避免兩個線程同時(shí)寫入一個共享內(nèi)存,每一個線程當(dāng)需要執(zhí)行存取共享資源的代碼時(shí)首先等待直到自己獲得擁有權(quán). 在存取共享資源之后,線程釋放對互斥器的擁有權(quán)。

兩個或以上的進(jìn)程可以調(diào)用CreateMutex 來建立同樣名字的互斥器. 實(shí)際上第一個進(jìn)程建立的這個互斥器, 隨后的進(jìn)程只是得到了那個存在的互斥器的句柄. 這能使多進(jìn)程共用一個互斥器, 當(dāng)然用戶應(yīng)該有確保建立互斥器的進(jìn)程首先啟動的責(zé)任. 使用這種技術(shù),你應(yīng)該將這個 bInitialOwner標(biāo)記設(shè)置成FALSE; 否則, 它可以因不同的進(jìn)程最初擁有它而帶來困難.

多進(jìn)程可以有同一個mutex對象的句柄, 讓mutex對象能夠用于多進(jìn)程間同步. 下面的對象共享機(jī)制是適用的:

  • 一個子進(jìn)程通過CreateProcess?函數(shù)被建立,當(dāng)CreateMutex的lpMutexAttributes?參數(shù)給予相應(yīng)的mutex對象指針?biāo)梢岳^承到一個mutex對象的句柄.
  • 一個進(jìn)程可以在DuplicateHandle 函數(shù)中指定一個mutex對象句柄來建立一個句柄的拷貝由其他進(jìn)程使用.
  • 一個繼承可以指定一個mutex的名字通過 CreateMutex 函數(shù)得到這個mutex對象的句柄.

總的來說, 如果你想要進(jìn)行線程同步,臨界區(qū)域更高效些.

				#include <windows.h>
				#include <process.h>
				#include <stdio.h>
  
  HANDLE hMutex;
  int a[ 5 ];
  
  void Thread( void* pParams )
  { 
     int i, num = 0;
  
     while ( TRUE )
     { 
        WaitForSingleObject( hMutex, INFINITE );
        for ( i = 0; i < 5; i++ ) a[ i ] = num;
        ReleaseMutex( hMutex );
        num++;
     }
  }
  
  int main( void )
  {
     hMutex = CreateMutex( NULL, FALSE, NULL );
     _beginthread( Thread, 0, NULL );
  
     while( TRUE )
{ WaitForSingleObject( hMutex, INFINITE ); printf( "%d %d %d %d %d\n", a[ 0 ], a[ 1 ], a[ 2 ], a[ 3 ], a[ 4 ] ); ReleaseMutex( hMutex ); } return0; }

If you are running Windows 9x/NT/2000, you can run this program by clicking here.

Event Objects事件對象

若我們想要強(qiáng)制第二線程在主線程完成全局?jǐn)?shù)組的內(nèi)容輸出時(shí)執(zhí)行該如何?這樣的話每行的輸出就只是遞增1。

一個事件對象也是一個可以通過SetEvent or PulseEvent 函數(shù)設(shè)置像信號般的狀態(tài)的同步對象. 下面是兩種類型的事件對象.

Object Description
Manual-reset event
手動激發(fā)對象
只有使用ResetEvent 函數(shù)才可以將其設(shè)置為無激發(fā)狀態(tài). 當(dāng)它在激發(fā)狀態(tài)時(shí), 它會激發(fā)所有正在等待的線程, 執(zhí)行對相同 event對象的線程會立即從wait函數(shù)返回.
Auto-reset event
自動激發(fā)對象
一個只相應(yīng)一個線程的wait函數(shù)的事件對象(當(dāng)這個對象是激發(fā)狀態(tài)),wait函數(shù)返回同時(shí)事件對象自動變成無激發(fā)狀態(tài)?,當(dāng)沒有線程執(zhí)行wait事件對象仍然是激發(fā)狀態(tài).

event object的用處就在于它可以在它發(fā)生時(shí)向等待著的線程發(fā)出信號標(biāo)志從而使其wait結(jié)束.?舉個例子, 在overlapped I/O 操作時(shí), 當(dāng)異步操作完成時(shí)系統(tǒng)設(shè)置了那個由程序員指定(specified)的事件對象為信號狀態(tài). A 一個單一線程可以指定許多不同的事件對象在許多同時(shí)發(fā)生的overlapped 操作運(yùn)作, 調(diào)用一個多對象的wait函數(shù)可以當(dāng)任意一個event object激發(fā)時(shí)結(jié)束等待.

在一個線程中可使用 CreateEvent 函數(shù)建立一個event object. 在這個線程中指定這個event object 的特性是manual-reset?或者 auto-reset . 在這個線程中也可以命名一個event object. 其他進(jìn)程中的線程也可以使用 OpenEvent 通過event object的名字打開一個現(xiàn)存event object . 另外關(guān)于mutex, event, semaphore, 以及 timer objects的其他信息, 就參考《Interprocess Synchronization》的文章.

一個線程能夠用 PulseEvent?函數(shù)設(shè)置一個event?object 為信號狀態(tài)而后激發(fā)當(dāng)前適當(dāng)數(shù)量的wait線程,之后切換為無信號狀態(tài) .?對于一個manual-reset event object, 所有的等待線程被返回(release). 對于一個auto-reset event object, 這個函數(shù)只能釋放一個等待的線程, 即使有更多線程在等待. 如果沒有線程在函數(shù)調(diào)用時(shí)等待, PulseEvent 只是簡單的將事件狀態(tài)設(shè)為無信號并且返回(個人注釋,這應(yīng)該是跟setevent最不相同的地方!).

Collapse
				  #include <windows.h>
				  #include <process.h>
				  #include <stdio.h>
  
  HANDLE hEvent1, hEvent2;
  int a[ 5 ];
  
  void Thread( void* pParams )
  {
     int i, num = 0;

     while ( TRUE )
     {
        WaitForSingleObject( hEvent2, INFINITE );
        for ( i = 0; i < 5; i++ ) a[ i ] = num;
        SetEvent( hEvent1 );
        num++;
     }
  }
  
  int main( void )
  {
     hEvent1 = CreateEvent( NULL, FALSE, TRUE, NULL );
     hEvent2 = CreateEvent( NULL, FALSE, FALSE, NULL );
  
     _beginthread( Thread, 0, NULL );
  
     while( TRUE )
     { 
        WaitForSingleObject( hEvent1, INFINITE );
        printf( "%d %d %d %d %d\n", 
                a[ 0 ], a[ 1 ], a[ 2 ],
                a[ 3 ], a[ 4 ] );
        SetEvent( hEvent2 );
     }
     return0;
  }

If you are running Windows 9x/NT/2000, you can run this program by clicking here.

Summary of Synchronization Objects

The MSDN News for July/August 1998 has a front page article on Synchronization Objects. The following table is from that article:

Name Relative speed Cross process Resource counting Supported platforms
Critical Section Fast No No (exclusive access) 9x/NT/CE
Mutex Slow Yes No (exclusive access) 9x/NT/CE
Semaphore Slow Yes Automatic 9x/NT
Event Slow Yes Yes 9x/NT/CE
Metered Section Fast Yes Automatic 9x/NT/CE

by?William T. Block


from codeproject

謝謝回復(fù)的補(bǔ)充 ~~,上面拼錯了個詞,改過。。譯完了

posted on 2007-02-16 14:06 Gohan 閱讀(1012) 評論(1)  編輯 收藏 引用 所屬分類: C++

Feedback

# re: 翻譯一篇文章Introduction to Multi-threaded Code 多線程編程的一些代碼(先翻一點(diǎn)) 2007-02-22 17:10 池鳳彬

http://www.codeproject.com/script/profile/whos_who.asp?vt=arts&id=244

William T. Block View details
Status Gold. Member No. 244

View Member's Blog.
Awards
Messages Posted 11 - Poster
Articles Submitted
3 - Contributor
Biography Bill's recent projects include graphical displays and printing of real-time data for the Oil Industry.

"I started programming Windows' applications right after the release of Windows 1.0 and I am now actively working with Microsoft .NET"

He currently works for Baker Hughes in the Houston, Texas area.
Birthday Thursday 17th November, 1949
Location United States
Occupation Software development
Interests C++, MFC, Win32, C#, ASP.NET
Member since Thursday 6th July, 2000
(6 years, 7 months) Gold Level
Homepage http://www.wtblock.com/resume/  回復(fù)  更多評論   

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国模大胆一区二区三区| 亚洲国产mv| 午夜亚洲性色视频| 亚洲一区二区欧美日韩| 欧美午夜不卡在线观看免费| 一本色道综合亚洲| 在线综合亚洲欧美在线视频| 国产精品国产自产拍高清av王其| 亚洲视频在线观看| 国产精品99久久久久久人| 国产精品国产三级国产| 午夜久久资源| 久久精品国产一区二区三区免费看| 黄色成人av网站| 亚洲黄页视频免费观看| 欧美日韩亚洲一区三区| 亚洲欧美激情诱惑| 午夜精品久久久| 在线观看欧美激情| 日韩一级大片在线| 国产日韩一区在线| 亚洲电影免费在线观看| 国产精品chinese| 久久亚洲免费| 欧美日韩精品免费观看| 久久精品成人一区二区三区蜜臀 | 欧美黄色大片网站| 欧美日韩一区二区三区在线视频 | 在线看成人片| 亚洲六月丁香色婷婷综合久久| 国产精品户外野外| 欧美jizzhd精品欧美巨大免费| 欧美精品尤物在线| 久久久久88色偷偷免费| 欧美看片网站| 免费日本视频一区| 国产精品推荐精品| 最新国产の精品合集bt伙计| 国产欧美日韩在线 | 午夜日韩在线观看| 久久久无码精品亚洲日韩按摩| 99天天综合性| 久久久精品五月天| 性欧美大战久久久久久久免费观看| 久久免费偷拍视频| 欧美综合国产精品久久丁香| 欧美精品日韩三级| 欧美成人激情视频| 国产一区二区在线观看免费| 99精品福利视频| 91久久精品一区| 久久精品国产99精品国产亚洲性色| 亚洲网站视频福利| 欧美破处大片在线视频| 免费日韩av电影| 红桃视频国产一区| 久久大逼视频| 久久久久久久激情视频| 国产精品婷婷午夜在线观看| 一区二区三区偷拍| 亚洲午夜精品久久久久久app| 欧美1级日本1级| 欧美成人资源网| 在线日韩欧美视频| 久久久噜噜噜| 免费在线欧美黄色| 1024精品一区二区三区| 久久夜色精品国产噜噜av| 久久夜色精品国产欧美乱| 国产午夜精品理论片a级大结局 | 牛牛影视久久网| 欧美激情亚洲自拍| 亚洲精品国产精品国自产观看| 久久综合狠狠综合久久激情| 免播放器亚洲一区| 亚洲国产精品电影在线观看| 免费视频一区| 亚洲人成网站在线播| 99www免费人成精品| 久久久久久国产精品一区| 国产乱码精品1区2区3区| 欧美一区二视频| 老色批av在线精品| 亚洲国产精品一区二区第一页| 久久综合给合久久狠狠狠97色69| 亚洲国产精品一区制服丝袜 | 91久久一区二区| 欧美国产综合| 亚洲性图久久| 久久久久久久久久码影片| 亚洲成色最大综合在线| 欧美不卡视频一区发布| 日韩亚洲不卡在线| 久久精品国产欧美激情| 亚洲国产日韩一区二区| 欧美激情亚洲激情| 亚洲影视在线播放| 麻豆精品网站| 中日韩美女免费视频网址在线观看 | 精品91在线| 欧美好骚综合网| 亚洲欧美日本日韩| 免费成人黄色片| 一本一本大道香蕉久在线精品| 国产九色精品成人porny| 快she精品国产999| 国产精品99久久久久久宅男| 玖玖在线精品| 亚洲婷婷在线| 1204国产成人精品视频| 国产精品久久久久7777婷婷| 久久精品二区亚洲w码| 亚洲美女免费视频| 麻豆精品视频在线观看| 亚洲一区二区四区| 久久综合色播五月| 一本色道久久99精品综合| 91久久视频| 国产区日韩欧美| 欧美女人交a| 久久一区二区三区av| 在线中文字幕日韩| 最近中文字幕日韩精品 | 亚洲大胆女人| 黄色av成人| 国产精品xxxav免费视频| 久久综合久久综合九色| 亚洲在线观看免费| 99国产精品视频免费观看| 欧美高潮视频| 久久综合中文色婷婷| 午夜精品影院在线观看| 一区二区三区精密机械公司| 亚洲成在人线av| 国产一区二区三区四区五区美女 | 国产麻豆视频精品| 欧美日韩在线播放三区| 暖暖成人免费视频| 久久男人资源视频| 欧美在线你懂的| 午夜激情久久久| 亚洲一区尤物| 亚洲一区在线观看免费观看电影高清| 亚洲精品一品区二品区三品区| 欧美激情一区在线| 欧美激情bt| 亚洲国产黄色| 亚洲高清影视| 亚洲国产毛片完整版| 亚洲第一久久影院| 亚洲国产三级网| 亚洲日本理论电影| 日韩午夜黄色| av不卡在线| 亚洲欧美日韩在线综合| 午夜在线不卡| 久久精品观看| 欧美成人午夜激情视频| 欧美日韩第一区日日骚| 欧美三日本三级少妇三99| 国产精品va| 国内成+人亚洲+欧美+综合在线| 国产在线播放一区二区三区| 黄色成人在线免费| 亚洲国产精品久久91精品| 亚洲精品视频在线观看网站| 夜夜嗨网站十八久久| 亚洲伊人伊色伊影伊综合网| 欧美一区二区日韩一区二区| 久久亚洲春色中文字幕| 欧美激情亚洲精品| 在线视频日韩| 久久久久欧美| 欧美日韩另类视频| 国产欧美日韩精品a在线观看| 悠悠资源网亚洲青| 亚洲图片欧洲图片av| 久久精品国产亚洲aⅴ| 欧美黄色一区二区| 亚洲婷婷在线| 久久精品亚洲乱码伦伦中文 | 国产女人18毛片水18精品| 国产综合色精品一区二区三区| 亚洲啪啪91| 午夜一区不卡| 欧美国产日本在线| 亚洲一区二区三区久久| 久久亚洲风情| 国产精品每日更新在线播放网址| 黑人巨大精品欧美黑白配亚洲| 亚洲精品一二三区| 久久精品国产久精国产爱| 亚洲国产三级| 久久久久久综合| 国产欧美 在线欧美| 亚洲蜜桃精久久久久久久| 久久精品中文字幕一区二区三区| 亚洲日本中文字幕| 久久久久久久999| 国产精品外国|