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

我住包子山

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

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

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運行時庫調用)的API可以在MFC應用程序中替換成AfxBeginThread

無同步(No Synchronization)

這第一個例子描述了兩個互不同步的線程。進程中的首要線程--主函數循環,輸出全局整形數組的內容。還有一個線程“Thread”不停的給數組每個元素+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;
  }

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

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

?

關鍵區域/臨界區域 對象(Critical Section Objects)

如果你想讓主線程等待Thread線程處理好全局數組再做打印,一種解決方法是使用關鍵區域對象。
關鍵區域對象提供同步于使用互斥器(Mutex)對象很相似, 除了關鍵區域對象之能在一個進程內發揮效用。Event, mutex,?以及 semaphore?對象也可以用在單進程的應用程序中, 但是關鍵區域對象提供一個相對快捷更加高效的同步機制. 就像互斥器一樣, 一個關鍵區域對象只能同時被一個線程擁有, 這個關鍵區域能夠在同時發生的數據存取時保護共享資源. 獲取關鍵區域的先后順序不定,可是不用太擔心,系統對于每一個線程都是平等的。

???  
  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)

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

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

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

  • 一個子進程通過CreateProcess?函數被建立,當CreateMutex的lpMutexAttributes?參數給予相應的mutex對象指針它可以繼承到一個mutex對象的句柄.
  • 一個進程可以在DuplicateHandle 函數中指定一個mutex對象句柄來建立一個句柄的拷貝由其他進程使用.
  • 一個繼承可以指定一個mutex的名字通過 CreateMutex 函數得到這個mutex對象的句柄.

總的來說, 如果你想要進行線程同步,臨界區域更高效些.

				#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事件對象

若我們想要強制第二線程在主線程完成全局數組的內容輸出時執行該如何?這樣的話每行的輸出就只是遞增1。

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

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

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

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

一個線程能夠用 PulseEvent?函數設置一個event?object 為信號狀態而后激發當前適當數量的wait線程,之后切換為無信號狀態 .?對于一個manual-reset event object, 所有的等待線程被返回(release). 對于一個auto-reset event object, 這個函數只能釋放一個等待的線程, 即使有更多線程在等待. 如果沒有線程在函數調用時等待, PulseEvent 只是簡單的將事件狀態設為無信號并且返回(個人注釋,這應該是跟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

謝謝回復的補充 ~~,上面拼錯了個詞,改過。。譯完了

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

Feedback

# re: 翻譯一篇文章Introduction to Multi-threaded Code 多線程編程的一些代碼(先翻一點) 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/  回復  更多評論   

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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视频| 亚洲欧美激情四射在线日 | 国产视频一区在线观看一区免费| 91久久精品国产91久久| 久久久久久亚洲精品杨幂换脸 | 亚洲国产精品美女| 亚洲欧美精品| 国产精品久久久久久久久免费桃花 | 久久久久久网| 极品av少妇一区二区| 久久九九99视频| 久久er精品视频| 激情一区二区| 欧美国产精品va在线观看| 久久久久久久综合| 在线国产精品一区| 欧美影视一区| 国产精品久久久久久久久免费樱桃 | 欧美电影在线观看完整版| 亚洲国产高清视频| 亚洲丁香婷深爱综合| 欧美成人精品| 亚洲在线成人精品| 香蕉久久国产| 亚洲成人自拍视频| 亚洲精品免费看| 国产精品看片你懂得| 久久精品国产一区二区三| 久久久国产精品亚洲一区| 亚洲黄网站在线观看| 亚洲美女在线看| 国产午夜亚洲精品理论片色戒| 美女精品视频一区| 欧美日本一道本在线视频| 亚洲综合成人在线| 欧美一区二区网站| 亚洲免费激情| 亚洲免费一区二区| 亚洲国产欧美在线| 亚洲午夜三级在线| 伊人久久久大香线蕉综合直播 | 欧美亚州在线观看| 久久免费国产精品1| 欧美好吊妞视频| 欧美在线亚洲| 欧美精品www| 久久国产精品黑丝| 欧美国产一区视频在线观看| 欧美一区二区在线免费播放| 蜜乳av另类精品一区二区| 亚洲系列中文字幕| 老司机免费视频一区二区| 亚洲视频网站在线观看| 久久精品一区四区| 亚洲欧美日韩人成在线播放| 久久综合久久综合久久综合| 亚洲一区二区av电影| 久久久免费av| 欧美制服丝袜| 欧美体内she精视频在线观看| 裸体素人女欧美日韩| 国产精品私拍pans大尺度在线 | 国产精品入口夜色视频大尺度| 久久欧美肥婆一二区| 国产精品qvod| 亚洲人成在线观看一区二区| 激情五月婷婷综合| 午夜精品网站| 午夜激情综合网| 欧美三级网址| 亚洲日本欧美天堂| 亚洲欧洲一区二区三区| 久久成人综合网| 欧美中文在线字幕| 国产精品免费在线 | 中文亚洲欧美| 久久亚洲欧美国产精品乐播| 亚洲在线观看视频| 欧美高清视频一区二区| 欧美精品v日韩精品v国产精品| 欧美福利在线| 一区二区高清视频在线观看| 久久嫩草精品久久久精品| 欧美一区二区三区在线视频| 国产精品高清网站| 亚洲最黄网站| 亚洲婷婷在线| 国产精品国产一区二区| 亚洲乱码国产乱码精品精天堂| 亚洲精品护士| 欧美精品一区二区高清在线观看| 亚洲国产成人在线视频| 亚洲精品护士| 欧美日韩免费观看一区=区三区| 亚洲福利国产精品| 亚洲精品综合在线| 欧美日韩国产精品一卡| 亚洲精品在线免费| 亚洲午夜一区二区三区| 国产精品女同互慰在线看| 亚洲新中文字幕| 久久九九热re6这里有精品| 国产日产精品一区二区三区四区的观看方式| 一本色道久久综合精品竹菊| 亚洲欧美日韩一区在线观看| 国产日韩欧美视频在线| 久久精品99无色码中文字幕| 欧美夫妇交换俱乐部在线观看| 亚洲精品一区二区在线观看| 欧美日韩在线播放一区二区| 亚洲欧美不卡| 欧美国产在线视频| 亚洲一区二区三区777| 国产区日韩欧美| 六月婷婷一区| 一本色道久久99精品综合| 午夜一区不卡| 亚洲国产精品黑人久久久| 欧美精品粉嫩高潮一区二区| 亚洲婷婷国产精品电影人久久| 久久久久女教师免费一区| 最新国产の精品合集bt伙计| 欧美日韩在线亚洲一区蜜芽| 香蕉久久国产| 亚洲国产精品va| 午夜精品剧场| 91久久精品国产91久久性色tv| 欧美调教视频| 久久这里只有| 亚洲——在线| 亚洲国产精品一区| 久久国内精品视频| 99精品视频一区| 激情偷拍久久| 国产精品日本欧美一区二区三区| 老司机aⅴ在线精品导航| 亚洲免费视频一区二区| 亚洲精品综合在线| 嫩草伊人久久精品少妇av杨幂| 亚洲视频视频在线| 亚洲精品欧美日韩专区| 国产一区二区三区的电影| 欧美日韩国产色站一区二区三区| 久久国产欧美精品| 亚洲一区欧美一区| 欧美一区二区三区四区在线观看| 欧美夫妇交换俱乐部在线观看| 亚洲欧美中文另类| 亚洲伦理在线免费看| 欧美va亚洲va香蕉在线| 欧美在现视频| 亚洲欧美精品中文字幕在线| 亚洲精品免费看| 亚洲国产精品久久人人爱蜜臀| 国产欧美日本| 国产精品久在线观看| 欧美日韩一区二区三区四区在线观看| 久热精品视频| 久久精品91久久香蕉加勒比| 午夜精品亚洲| 午夜国产精品视频| 中文av一区特黄| 一区二区免费看| 日韩亚洲成人av在线| 亚洲三级免费观看| 亚洲娇小video精品| 亚洲二区在线视频| 欧美福利一区二区三区| 噜噜噜在线观看免费视频日韩 | 久久国产精品久久久久久久久久| 亚洲尤物精选| 午夜欧美不卡精品aaaaa| 亚洲一区二区不卡免费| 一区二区欧美日韩视频| 亚洲理伦电影| 夜夜夜精品看看| 一区二区三区国产盗摄| 国产精品99久久久久久久女警| 一区二区三区精品国产| 一区二区三区精品在线| 亚洲午夜久久久久久久久电影院| 亚洲字幕在线观看| 翔田千里一区二区| 久久精品最新地址| 久热国产精品| 欧美日韩另类视频| 国产精品欧美一区二区三区奶水| 国产农村妇女精品一区二区| 国产亚洲欧美一区在线观看| 黄色成人av在线| 亚洲黄色片网站| 亚洲性图久久| 久久精品久久综合| 欧美成人午夜| 99精品国产在热久久下载| 亚洲一线二线三线久久久| 欧美一区二区在线看| 蜜桃伊人久久| 国产精品美女一区二区在线观看|