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

C++ Programmer's Cookbook

{C++ 基礎(chǔ)} {C++ 高級} {C#界面,C++核心算法} {設(shè)計(jì)模式} {C#基礎(chǔ)}

C++多線程(六)

多線程之線程同步Mutex (功能與CriticalSection相同,保證某一時(shí)刻只有一個(gè)線程能夠訪問共享資源,但是是內(nèi)核對象,所以訪問速度要比CriticalSection要慢,但是增加了等待超時(shí)的功能,使用時(shí)可以根據(jù)實(shí)際的情況選擇其一

一 Mutex
    互斥對象(mutex)內(nèi)核對象能夠確保線程擁有對單個(gè)資源的互斥訪問權(quán)。實(shí)際上互斥對象是因此而得名的。互斥對象包含一個(gè)使用數(shù)量,一個(gè)線程ID和一個(gè)遞歸計(jì)數(shù)器。
    互斥對象的行為特性與關(guān)鍵代碼段相同,但是互斥對象屬于內(nèi)核對象,而關(guān)鍵代碼段則屬于用戶方式對象。這意味著互斥對象的運(yùn)行速度比關(guān)鍵代碼段要慢。但是這也意味著不同進(jìn)程中的多個(gè)線程能夠訪問單個(gè)互斥對象,并且這意味著線程在等待訪問資源時(shí)可以設(shè)定一個(gè)超時(shí)值。

    ID用于標(biāo)識系統(tǒng)中的哪個(gè)線程當(dāng)前擁有互斥對象,遞歸計(jì)數(shù)器用于指明該線程擁有互斥對象的次數(shù)。
    互斥對象有許多用途,屬于最常用的內(nèi)核對象之一。通常來說,它們用于保護(hù)由多個(gè)線程訪問的內(nèi)存塊。如果多個(gè)線程要同時(shí)訪問內(nèi)存塊,內(nèi)存塊中的數(shù)據(jù)就可能遭到破壞。互斥對象能夠保證訪問內(nèi)存塊的任何線程擁有對該內(nèi)存塊的獨(dú)占訪問權(quán),這樣就能夠保證數(shù)據(jù)的完整性。

互斥對象的使用規(guī)則如下:

• 如果線程ID是0(這是個(gè)無效ID),互斥對象不被任何線程所擁有,并且發(fā)出該互斥對象的通知信號。

• 如果ID是個(gè)非0數(shù)字,那么一個(gè)線程就擁有互斥對象,并且不發(fā)出該互斥對象的通知信號。

• 與所有其他內(nèi)核對象不同, 互斥對象在操作系統(tǒng)中擁有特殊的代碼,允許它們違反正常的規(guī)則。

若要使用互斥對象,必須有一個(gè)進(jìn)程首先調(diào)用CreateMutex,以便創(chuàng)建互斥對象:
HANDLECreateMutex(
   PSECURITY_ATTRIBUTES psa,
   BOOL fInitialOwner,
   PCTSTR pszName);
 InitialOwner參數(shù)用于控制互斥對象的初始狀態(tài)。如果傳遞FALSE(這是通常情況下傳遞的值),那么互斥對象的ID和遞歸計(jì)數(shù)器均被設(shè)置為0。這意味著該互斥對象沒有被任何線程所擁有,因此要發(fā)出它的通知信號。
如果為fInitialOwner參數(shù)傳遞TRUE,那么該對象的線程ID被設(shè)置為調(diào)用線程的ID,遞歸計(jì)數(shù)器被設(shè)置為1。由于ID是個(gè)非0數(shù)字,因此該互斥對象開始時(shí)不發(fā)出通知信號。

通過調(diào)用一個(gè)等待函數(shù),并傳遞負(fù)責(zé)保護(hù)資源的互斥對象的句柄,線程就能夠獲得對共享資源的訪問權(quán)。在內(nèi)部,等待函數(shù)要檢查線程的ID,以了解它是否是0(互斥對象發(fā)出通知信號)。如果線程ID是0,那么該線程ID被設(shè)置為調(diào)用線程的ID,遞歸計(jì)數(shù)器被設(shè)置為1,同時(shí),調(diào)用線程保持可調(diào)度狀態(tài)。

如果等待函數(shù)發(fā)現(xiàn)ID不是0(不發(fā)出互斥對象的通知信號),那么調(diào)用線程便進(jìn)入等待狀態(tài)。系統(tǒng)將記住這個(gè)情況,并且在互斥對象的ID重新設(shè)置為0時(shí),將線程ID設(shè)置為等待線程的ID,將遞歸計(jì)數(shù)器設(shè)置為1,并且允許等待線程再次成為可調(diào)度線程。與所有情況一樣,對互斥內(nèi)核對象進(jìn)行的檢查和修改都是以原子操作方式進(jìn)行的。

一旦線程成功地等待到一個(gè)互斥對象,該線程就知道它已經(jīng)擁有對受保護(hù)資源的獨(dú)占訪問權(quán)。試圖訪問該資源的任何其他線程(通過等待相同的互斥對象)均被置于等待狀態(tài)中。當(dāng)目前擁有對資源的訪問權(quán)的線程不再需要它的訪問權(quán)時(shí),它必須調(diào)用ReleaseMutex函數(shù)來釋放該互斥對象:
BOOL ReleaseMutex(HANDLE hMutex);
該函數(shù)將對象的遞歸計(jì)數(shù)器遞減1。

當(dāng)該對象變?yōu)橐淹ㄖ獱顟B(tài)時(shí),系統(tǒng)要查看是否有任何線程正在等待互斥對象。如果有,系統(tǒng)將“按公平原則”選定等待線程中的一個(gè),為它賦予互斥對象的所有權(quán)。當(dāng)然,這意味著線程I D被設(shè)置為選定的線程的ID,并且遞歸計(jì)數(shù)器被置為1。如果沒有其他線程正在等待互斥對象,那么該互斥對象將保持已通知狀態(tài),這樣,等待互斥對象的下一個(gè)線程就立即可以得到互斥對象。

二 API

Mutex function Description
CreateMutex Creates or opens a named or unnamed mutex object.
CreateMutexEx Creates or opens a named or unnamed mutex object and returns a handle to the object.
OpenMutex Opens an existing named mutex object.
ReleaseMutex Releases ownership of the specified mutex object.

三 實(shí)例
來自msdn的實(shí)例:在線程函數(shù)中有一個(gè)循環(huán),在每個(gè)循環(huán)的開始都取得Mutex,然后對全局或靜態(tài)操作,相當(dāng)于在關(guān)鍵代碼段操作,然后在使用完以后釋放它,大家可以執(zhí)行,查看結(jié)果。

#include <windows.h>
#include 
<stdio.h>

#define THREADCOUNT 64  //less than 64
HANDLE ghMutex; 
int g_x = 0;

DWORD WINAPI WriteToDatabase(LPVOID);

void main()
{
    HANDLE aThread[THREADCOUNT];
    DWORD ThreadID;
    
int i;

    
// Create a mutex with no initial owner
    ghMutex = CreateMutex( 
        NULL,              
// default security attributes
        FALSE,             // initially not owned
        NULL);             // unnamed mutex

    
if (ghMutex == NULL) 
    
{
        printf(
"CreateMutex error: %d\n", GetLastError());
        
return;
    }


    
// Create worker threads

    
for( i=0; i < THREADCOUNT; i++ )
    
{
        aThread[i] 
= CreateThread( 
                     NULL,       
// default security attributes
                     0,          // default stack size
                     (LPTHREAD_START_ROUTINE) WriteToDatabase, 
                     NULL,       
// no thread function arguments
                     0,          // default creation flags
                     &ThreadID); // receive thread identifier

        
if( aThread[i] == NULL )
        
{
            printf(
"CreateThread error: %d\n", GetLastError());
            
return;
        }

    }


    
// Wait for all threads to terminate

    WaitForMultipleObjects(THREADCOUNT, aThread, TRUE, INFINITE);

    
// Close thread and mutex handles
    for( i=0; i < THREADCOUNT; i++ )
        CloseHandle(aThread[i]);
    CloseHandle(ghMutex);

    printf(
"g_x is :%d\n",g_x);
}


DWORD WINAPI WriteToDatabase( LPVOID lpParam )

    DWORD dwCount
=0, dwWaitResult; 

    
// Request ownership of mutex.

    
while( dwCount < 100 )
    

        dwWaitResult 
= WaitForSingleObject( 
            ghMutex,    
// handle to mutex
            INFINITE);  // no time-out interval
 
        
switch (dwWaitResult) 
        
{
            
// The thread got ownership of the mutex
            case WAIT_OBJECT_0: 
                __try 

                    g_x
++;
                    
// TODO: Write to the database
                    printf("Thread %d writing to database\n"
                           GetCurrentThreadId());
                    dwCount
++;
                }
 

                __finally 

                    
// Release ownership of the mutex object
                    if (! ReleaseMutex(ghMutex)) 
                    

                        
// Deal with error.
                    }
 
                }
 
                
break

            
// The thread got ownership of an abandoned mutex
            case WAIT_ABANDONED: 
                
return FALSE; 
        }

    }

    
return TRUE; 
}


四 參考

posted on 2007-07-29 22:46 夢在天涯 閱讀(4144) 評論(3)  編輯 收藏 引用 所屬分類: CPlusPlus

評論

# re: C++多線程(六) 2007-07-29 23:27 阿福

C++是沒有__finally這個(gè)關(guān)鍵字的,這是MFC里面提供的關(guān)鍵字嗎?  回復(fù)  更多評論   

# re: C++多線程(六) 2007-07-30 09:13 夢在天涯

__try __finally 應(yīng)該是windows SEH在VC下的實(shí)現(xiàn)把。

C++本身是沒有finally的。  回復(fù)  更多評論   

# re: C++多線程(六) 2007-07-30 11:18 pass86

__try __finally反掌不是標(biāo)準(zhǔn)C++里,可能是WIN32 SDK里的,也可能是MFC中的,了解較少。LZ的系列帖子贊一個(gè)。  回復(fù)  更多評論   

公告

EMail:itech001#126.com

導(dǎo)航

統(tǒng)計(jì)

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

常用鏈接

隨筆分類

隨筆檔案

收藏夾

Blogs

c#(csharp)

C++(cpp)

Enlish

Forums(bbs)

My self

Often go

Useful Webs

Xml/Uml/html

搜索

  •  

積分與排名

  • 積分 - 1816188
  • 排名 - 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>
              老巨人导航500精品| 激情六月婷婷久久| 夜夜嗨av一区二区三区网页 | 午夜视黄欧洲亚洲| 国产精品视频一二| 欧美在线日韩| 免费日韩成人| 日韩午夜免费视频| 欧美日韩国产综合视频在线观看中文 | 欧美福利视频在线| 亚洲伦理自拍| 欧美性猛交99久久久久99按摩 | 国产在线国偷精品产拍免费yy| 欧美一区二区三区免费观看视频| 麻豆精品网站| 亚洲午夜女主播在线直播| 国产视频欧美| 欧美大秀在线观看 | 欧美在线看片| 亚洲激精日韩激精欧美精品| 日韩一级黄色大片| 国产亚洲激情视频在线| 欧美成人午夜视频| 亚洲欧美日韩精品| 最近中文字幕日韩精品| 欧美中文字幕精品| 日韩亚洲精品电影| 国产亚洲欧美在线| 欧美日韩调教| 狼狼综合久久久久综合网 | 亚洲在线一区| 欧美黄色网络| 欧美在线啊v| aa国产精品| 雨宫琴音一区二区在线| 国产精品二区二区三区| 久热re这里精品视频在线6| 国产主播精品| 亚洲午夜伦理| 亚洲国产日韩一级| 久久福利影视| 亚洲欧美国产精品桃花| 亚洲精品国产精品国自产观看浪潮 | 亚洲九九爱视频| 狠狠色噜噜狠狠狠狠色吗综合| 欧美视频一区二| 狂野欧美激情性xxxx欧美| 午夜一区二区三区在线观看| 亚洲精选视频免费看| 欧美电影专区| 久久久久9999亚洲精品| 午夜精彩视频在线观看不卡 | 欧美一激情一区二区三区| 最新热久久免费视频| 国产无一区二区| 国产精品久久久久久久久久直播| 免费观看亚洲视频大全| 久久久99久久精品女同性| 亚洲欧美日韩精品在线| 一本大道久久a久久精二百| 亚洲经典三级| 欧美国产一区在线| 鲁大师影院一区二区三区| 久久久成人网| 欧美成人嫩草网站| 亚洲激情校园春色| 亚洲第一精品电影| 亚洲第一区在线观看| 欧美国产日韩一区二区在线观看| 久久伊人一区二区| 巨乳诱惑日韩免费av| 久久综合影音| 欧美成人精品在线观看| 欧美aaaaaaaa牛牛影院| 欧美高清在线精品一区| 欧美国产亚洲另类动漫| 亚洲高清激情| 最新日韩欧美| 亚洲国产三级网| 亚洲成在线观看| 你懂的视频欧美| 欧美高清在线视频| 亚洲精品久久久久久一区二区| 亚洲剧情一区二区| 制服丝袜激情欧洲亚洲| 亚洲欧美精品在线| 西西裸体人体做爰大胆久久久| 午夜精品国产| 久久免费视频网| 欧美成人亚洲成人日韩成人| 欧美人与禽猛交乱配视频| 欧美性猛交一区二区三区精品| 欧美性事免费在线观看| 国产精品va| 国产一区二区三区av电影| 亚洲国产精品一区二区第一页| 亚洲人成在线观看| 亚洲综合国产精品| 久久精品国产2020观看福利| 久久免费偷拍视频| 亚洲黄色有码视频| 在线国产精品一区| 国产精品伦一区| 在线观看欧美亚洲| 亚洲性感美女99在线| 欧美中文在线字幕| 亚洲激情精品| 亚洲欧美日本伦理| 美日韩精品视频免费看| 国产精品久久久久久亚洲调教| 国内精品久久久久久久影视麻豆| 亚洲国产精品一区制服丝袜| 一区二区三区精品久久久| 91久久国产精品91久久性色| 99在线观看免费视频精品观看| 亚欧成人在线| 亚洲国产精品va在线观看黑人| 亚洲网站在线看| 麻豆亚洲精品| 国产日韩欧美精品一区| 亚洲精品欧美专区| 欧美专区一区二区三区| 嫩草国产精品入口| 亚洲欧美国产不卡| 欧美高清在线观看| 极品av少妇一区二区| 亚洲性感激情| 亚洲黄色成人久久久| 欧美在线视频免费观看| 欧美日韩在线观看一区二区| 在线播放亚洲一区| 欧美在线一区二区| 日韩亚洲精品在线| 老色批av在线精品| 国产亚洲精品一区二555| 亚洲私人影院在线观看| 欧美激情一区二区三区蜜桃视频| 亚洲综合国产| 欧美日韩中字| 99re66热这里只有精品4| 久久综合久久美利坚合众国| 老司机精品视频一区二区三区| 国产精品欧美一区二区三区奶水 | 欧美午夜激情在线| 亚洲欧洲日夜超级视频| 久久亚洲精品中文字幕冲田杏梨| 亚洲一区日韩| 国产精品白丝av嫩草影院| 日韩视频在线观看一区二区| 免费成人av在线看| 久久成人免费视频| 国产精品美女主播在线观看纯欲| 一区二区三区日韩欧美精品| 亚洲日本理论电影| 欧美freesex交免费视频| 亚洲国产精品久久久久久女王| 久久午夜电影| 欧美伊人久久久久久久久影院| 国产精品三级久久久久久电影| 一个人看的www久久| 亚洲精品中文字| 欧美三级第一页| 亚洲一区二区高清视频| 一个色综合导航| 欧美体内she精视频| 亚洲一区二区在| 中日韩男男gay无套| 国产精品国产三级国产普通话蜜臀 | 在线播放精品| 欧美福利一区二区| 欧美精品国产精品日韩精品| 亚洲精品乱码久久久久久蜜桃麻豆 | 亚洲一区二区三区中文字幕在线| 欧美日韩综合精品| 在线视频欧美日韩| 日韩天堂在线视频| 国产精品免费一区豆花| 欧美影院视频| 久久久国产午夜精品| 亚洲国产精品va在线观看黑人| 欧美激情在线观看| 欧美色另类天堂2015| 亚洲综合电影| 久久精品人人做人人综合 | 欧美日韩网址| 午夜精品福利一区二区蜜股av| 亚洲综合清纯丝袜自拍| 国产亚洲精品bv在线观看| 美女性感视频久久久| 欧美成人免费视频| 亚洲午夜精品一区二区三区他趣| 亚洲男人的天堂在线观看| 国产一区二区三区久久久| 免费观看成人鲁鲁鲁鲁鲁视频| 欧美激情一区三区| 香蕉尹人综合在线观看| 久久国产欧美日韩精品| 最近看过的日韩成人| 亚洲一区国产精品| 亚洲第一福利视频|