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

C++ Programmer's Cookbook

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

C++多線程(六)

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

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

    ID用于標識系統中的哪個線程當前擁有互斥對象,遞歸計數器用于指明該線程擁有互斥對象的次數。
    互斥對象有許多用途,屬于最常用的內核對象之一。通常來說,它們用于保護由多個線程訪問的內存塊。如果多個線程要同時訪問內存塊,內存塊中的數據就可能遭到破壞。互斥對象能夠保證訪問內存塊的任何線程擁有對該內存塊的獨占訪問權,這樣就能夠保證數據的完整性。

互斥對象的使用規則如下:

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

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

• 與所有其他內核對象不同, 互斥對象在操作系統中擁有特殊的代碼,允許它們違反正常的規則。

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

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

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

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

當該對象變為已通知狀態時,系統要查看是否有任何線程正在等待互斥對象。如果有,系統將“按公平原則”選定等待線程中的一個,為它賦予互斥對象的所有權。當然,這意味著線程I D被設置為選定的線程的ID,并且遞歸計數器被置為1。如果沒有其他線程正在等待互斥對象,那么該互斥對象將保持已通知狀態,這樣,等待互斥對象的下一個線程就立即可以得到互斥對象。

二 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.

三 實例
來自msdn的實例:在線程函數中有一個循環,在每個循環的開始都取得Mutex,然后對全局或靜態操作,相當于在關鍵代碼段操作,然后在使用完以后釋放它,大家可以執行,查看結果。

#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 夢在天涯 閱讀(4142) 評論(3)  編輯 收藏 引用 所屬分類: CPlusPlus

評論

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

C++是沒有__finally這個關鍵字的,這是MFC里面提供的關鍵字嗎?  回復  更多評論   

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

__try __finally 應該是windows SEH在VC下的實現把。

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

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

__try __finally反掌不是標準C++里,可能是WIN32 SDK里的,也可能是MFC中的,了解較少。LZ的系列帖子贊一個。  回復  更多評論   

公告

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精品国产在热久久下载| 国产无一区二区| 宅男噜噜噜66国产日韩在线观看| 久久福利毛片| 免费在线一区二区| 亚洲精品久久久久久一区二区| 久久久久se| 欧美黄色一级视频| 91久久久精品| 欧美日韩成人在线视频| 一区二区三区精品| 欧美中日韩免费视频| 黄色一区二区三区| 欧美fxxxxxx另类| 宅男噜噜噜66国产日韩在线观看| 亚洲欧美区自拍先锋| 国产伦精品一区二区三区免费迷 | 免费看av成人| 日韩视频免费在线观看| 欧美在线二区| 精品成人在线| 欧美午夜片欧美片在线观看| 午夜欧美精品久久久久久久| 欧美xart系列高清| 亚洲免费小视频| 亚洲天堂成人在线观看| 一区二区三区精品视频| 亚洲欧美精品一区| 韩国精品在线观看| 欧美不卡视频一区| 亚洲一本视频| 欧美成人免费网| 欧美一区1区三区3区公司| 亚洲国产精品成人综合| 欧美亚洲第一区| 美女91精品| 亚洲欧美中文日韩在线| 亚洲电影免费| 午夜精品久久久久久99热软件| 黄色在线一区| 国产精品午夜在线观看| 欧美福利视频在线| 性欧美大战久久久久久久久| 亚洲国产cao| 久久精品国产精品亚洲精品| 最近中文字幕日韩精品| 亚洲第一精品夜夜躁人人躁 | 美女久久网站| 亚洲一区亚洲二区| 亚洲精品国久久99热| 蜜臀av性久久久久蜜臀aⅴ四虎 | 在线视频日韩| 亚洲人体影院| 在线观看欧美精品| 韩国女主播一区| 国产欧美大片| 国产精品swag| 欧美日韩一区二区免费视频| 欧美高清在线一区| 欧美国产综合一区二区| 久热精品视频在线观看| 久久久久亚洲综合| 久久精品国产91精品亚洲| 亚洲宅男天堂在线观看无病毒| 亚洲日韩欧美视频一区| 亚洲福利在线视频| 亚洲国产片色| 亚洲电影av| 亚洲精品乱码久久久久久蜜桃麻豆 | 一区二区高清视频| 一本色道久久综合| 亚洲素人一区二区| 亚洲综合大片69999| 欧美承认网站| 亚洲午夜激情网站| 亚洲美女电影在线| 99亚洲一区二区| 亚洲一区中文| 欧美专区在线播放| 久久久久久久久久码影片| 久久久精品五月天| 免费日韩精品中文字幕视频在线| 另类酷文…触手系列精品集v1小说| 毛片一区二区| 欧美日韩亚洲一区在线观看| 欧美小视频在线观看| 国产精品美女久久久浪潮软件| 国产精品视频网站| 在线观看视频一区| 在线综合欧美| 久久亚洲欧美国产精品乐播| 欧美韩日一区二区| 亚洲视频一区在线观看| 久久九九电影| 国产精品jizz在线观看美国| 国产色产综合色产在线视频| 91久久精品国产91久久| 亚洲午夜精品| 葵司免费一区二区三区四区五区| 亚洲国产日韩综合一区| 亚洲婷婷在线| 欧美www视频| 国产精品女主播一区二区三区| 韩日精品在线| 99精品视频一区| 久久久九九九九| 日韩午夜在线播放| 久久久久久夜| 国产精品区一区| 亚洲欧洲精品成人久久奇米网| 午夜伦欧美伦电影理论片| 欧美成在线视频| 亚洲欧美成人一区二区三区| 免费一级欧美片在线观看| 国产精品日韩精品欧美在线| 最新国产精品拍自在线播放| 午夜精品久久久久久久99黑人| 美女性感视频久久久| 亚洲手机在线| 欧美激情精品久久久久久| 黄色一区二区三区| 午夜免费日韩视频| 亚洲开发第一视频在线播放| 久久久久国产成人精品亚洲午夜| 国产精品高潮呻吟久久av黑人| 亚洲精品国产精品国产自| 久久国产精品久久精品国产| 日韩午夜电影| 欧美国产综合| 久久亚洲影音av资源网| aa级大片欧美| 久久精品亚洲精品| 国产精品日韩久久久久| 日韩视频在线永久播放| 欧美国产乱视频| 欧美在线短视频| 国产色产综合色产在线视频| 亚洲欧美日韩精品久久久久| 99re热这里只有精品视频| 欧美成人午夜77777| 亚洲欧洲精品一区二区三区不卡 | 久久在线免费观看视频| 国产婷婷色一区二区三区四区| 午夜亚洲性色视频| 亚洲一区三区视频在线观看| 国产精品香蕉在线观看| 欧美一区二区在线| 午夜视频久久久久久| 伊大人香蕉综合8在线视| 久久综合久久久| 免费在线观看日韩欧美| 亚洲精品美女| 夜夜爽99久久国产综合精品女不卡| 欧美激情视频给我| 亚洲一区二区三区免费在线观看| 99视频在线观看一区三区| 欧美日韩久久不卡| 亚洲自拍16p| 性欧美18~19sex高清播放| 伊人久久成人| 99精品国产在热久久婷婷| 国产精品国产自产拍高清av王其| 久久精品视频在线免费观看| 久久免费视频这里只有精品| 亚洲精品美女91| 99热这里只有精品8| 国产视频一区三区| 亚洲国产日韩欧美综合久久| 国产精品国产三级国产普通话蜜臀| 久久av二区| 欧美精品一区二区三| 欧美一区二区三区在线视频 | 亚洲网站在线观看| 性欧美xxxx大乳国产app| 亚洲二区精品| 一区二区三区产品免费精品久久75| 国产日韩欧美麻豆| 欧美激情麻豆| 国产免费观看久久黄| 欧美激情在线观看| 国产欧美日韩视频一区二区三区| 亚洲国产mv| 国模精品娜娜一二三区| 夜夜嗨av色一区二区不卡| 欧美亚洲一区三区| 亚洲精品视频在线| 国产专区欧美专区| 亚洲第一精品夜夜躁人人爽| 国产精品久久久久久久久免费樱桃| 久久精品观看| 欧美日韩国产在线播放| 免费一级欧美片在线播放| 国产精品美女主播| 亚洲精品日韩在线| 亚洲欧洲在线视频| 久久久免费av| 久久综合国产精品台湾中文娱乐网 | 亚洲第一免费播放区| 国产亚洲毛片| 亚洲一区二区三区视频|