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

C++ Programmer's Cookbook

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

C++多線程(三)

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

一 Critical Sections

1) 因為Critical Sections不是內核對象,所以只能用來統一進程內線程間的同步,不能用來多個不同進程間的線程的同步。

2) 如果在Critical Sections中間突然程序crash或是exit而沒有調用LeaveCriticalSection,則結果是改線程所對應的內核不能被釋放,該線程成為死線程。

3) 要比其他的內核對象的速度要快。

二 使用CriticalSections的簡單實例,Stack在push的時候可以分為3個步驟,看下面的代碼,但是如果在第2步后此線程中斷切換到其他的線程,其他的線程push后再返回執行時,此線程繼續執行,這樣有可能剛才其他線程push就會被覆蓋了,在stack里找不到了。(下面的代碼在debug下使用了CriticalSection,release下可能有問題)

#include <windows.h>
#include 
<process.h>
#include 
<stdio.h>
/////////////////////////////////////////////
//stack:
struct Node 
{
    
struct Node *next; 
    
int data; 
}

struct Stack 

    
struct Node *head; 
#ifdef _DEBUG
    CRITICAL_SECTION critical_sec; 
#endif

    Stack()
    
{
        head 
= NULL;
#ifdef _DEBUG
        InitializeCriticalSection(
&critical_sec);
#endif
    }

    
~Stack()
    
{        
        
if(head != NULL)        
        
{
            
if(NULL == head->next)
            
{                
                delete head;
                head 
= NULL;
            }

            
else
            
{
                Node 
*= head;
                Node 
*= head->next;

                
while(q != NULL)
                
{                    
                    delete p;
                    p 
= q;
                    q 
= q->next;
                }
;                
                delete p;
                p 
= NULL;
            }
    
        }

#ifdef _DEBUG
        DeleteCriticalSection(
&critical_sec);
#endif
    }

    
void Push (int num) 
    

        
//enter critical section, add a new node and then     
#ifdef _DEBUG
        EnterCriticalSection (
&critical_sec);
#endif
        Node 
* node = new Node();
        node
->next = head;
        node
->data = num;
        head 
= node;  
        printf(
"Stack:%d\n",num);
        
//leave critical section 
#ifdef _DEBUG
        LeaveCriticalSection (
&critical_sec);
#endif
    }
 
    
int Pop () 
    

#ifdef _DEBUG
        EnterCriticalSection (
&critical_sec);
#endif
        
int result = 0;
        
if(head!= NULL)
        
{
            result 
= head->data;
            
if(head->next != NULL)
            
{
                Node 
*temp = head->next; 
                delete head;
                head 
= temp;
            }

            
else
                head 
= NULL;
        }
    
#ifdef _DEBUG
        LeaveCriticalSection (
&critical_sec); 
#endif
        
return result; 
    }

}
;

//////////////////////////////////////////////////////
//test:
unsigned  __stdcall Thread1(void * pVoid)
{
    Stack 
*stack = ((Stack*)pVoid);
    
for(int i = 200; i<220;++i)
    
{
        stack
->Push(i);
    }

    
return 1;        
}

unsigned __stdcall Thread2(
void *pVoid)
{
    Stack 
*stack = ((Stack*)pVoid);
    
for(int i = 0; i<20++i)
    
{
        stack
->Push(i);        
    }

    
return 1;
}

int main()

    Stack stack;
    stack.Push(
1000);
    stack.Push(
1000);

    HANDLE   hth1;
    unsigned  uiThread1ID;

    hth1 
= (HANDLE)_beginthreadex( NULL,         // security
        0,            // stack size
        Thread1,
        (
void*)&stack,           // arg list
        CREATE_SUSPENDED,  // so we can later call ResumeThread()
        &uiThread1ID );

    
if ( hth1 == 0 )
        printf(
"Failed to create thread 1\n");

    DWORD   dwExitCode;

    GetExitCodeThread( hth1, 
&dwExitCode );  // should be STILL_ACTIVE = 0x00000103 = 259
    printf( "initial thread 1 exit code = %u\n", dwExitCode );



    HANDLE   hth2;
    unsigned  uiThread2ID;

    hth2 
= (HANDLE)_beginthreadex( NULL,         // security
        0,            // stack size
        Thread2,
        (
void*)&stack,           // arg list
        CREATE_SUSPENDED,  // so we can later call ResumeThread()
        &uiThread2ID );

    
if ( hth2 == 0 )
        printf(
"Failed to create thread 2\n");

    GetExitCodeThread( hth2, 
&dwExitCode );  // should be STILL_ACTIVE = 0x00000103 = 259
    printf( "initial thread 2 exit code = %u\n", dwExitCode );  

    ResumeThread( hth1 );   
    ResumeThread( hth2 );

    WaitForSingleObject( hth1, INFINITE );
    WaitForSingleObject( hth2, INFINITE );

    GetExitCodeThread( hth1, 
&dwExitCode );
    printf( 
"thread 1 exited with code %u\n", dwExitCode );

    GetExitCodeThread( hth2, 
&dwExitCode );
    printf( 
"thread 2 exited with code %u\n", dwExitCode );

    CloseHandle( hth1 );
    CloseHandle( hth2 );    

    printf(
"Primary thread terminating.\n");
}


三 對Critical Section的封裝:
//////////////////////////////////////////////////////
// 方法一: Lock中的CritSect成員變量必須是引用類型。
class CritSect
{
public:
    friend 
class Lock;
    CritSect() 
{ InitializeCriticalSection(&_critSection); }
    
~CritSect() { DeleteCriticalSection(&_critSection); }
private:
    
void Acquire(){EnterCriticalSection(&_critSection);}
    
void Release(){LeaveCriticalSection(&_critSection);}

    CRITICAL_SECTION _critSection;
}
;

class Lock
{
public:
     Lock(CritSect
& critSect):_critSect(critSect) {    _critSect.Acquire(); }
     
~Lock(){_critSect.Release();}
private:
    CritSect
& _critSect;
}
;

//////////////////////////////////////////////////////
//方法二:
// MT-exclusive lock
class CLock {
public:
    CLock()             
{ InitializeCriticalSection (&m_criticalSection); }
    
void Lock ()        { EnterCriticalSection      (&m_criticalSection); }
    
void Unlock ()      { LeaveCriticalSection      (&m_criticalSection); }
    
virtual ~CLock()    { DeleteCriticalSection     (&m_criticalSection); }
private:
    CRITICAL_SECTION                    m_criticalSection;
}
;


// Scoped MT-exclusive lock
class CScopedLocker {
public:
    CScopedLocker (CLock 
* t) : m_lock (t)      { m_lock->Lock();   }
    
~CScopedLocker()                            { m_lock->Unlock(); }
private:
    CLock 
*                             m_lock;
}
;


對上面的2中封裝的調用都比較簡單,都是只有2行代碼。
CritSect sect;
Lock lock(sect);

CLock t;
CSCopedLocker st(&t);

下面的對封裝的測試代碼,保證了對g_n全局變量在線程1操作結束后線程2才可以操作。(下面的代碼因為對全局變量同步,所以需要申明含有CRITICAL_SECTION的類為全局)

#include<windows.h>
#include
<iostream>
using namespace std;

//////////////////////////////////////////////////////
// ·½·¨Ò»£º

class CritSect
{
public:
    friend 
class Lock;
    CritSect() 
{ InitializeCriticalSection(&_critSection); }
    
~CritSect() { DeleteCriticalSection(&_critSection); }
private:
    
void Acquire(){EnterCriticalSection(&_critSection);}
    
void Release(){LeaveCriticalSection(&_critSection);}

    CRITICAL_SECTION _critSection;
}
;

class Lock
{
public:
     Lock(CritSect
& critSect):_critSect(critSect) {    _critSect.Acquire(); }
     
~Lock(){_critSect.Release();}
private:
    CritSect
& _critSect;
}
;

//////////////////////////////////////////////////////
//·½·¨¶þ£º

// MT-exclusive lock
class CLock {
public:
    CLock()             
{ InitializeCriticalSection (&m_criticalSection); }
    
void Lock ()        { EnterCriticalSection      (&m_criticalSection); }
    
void Unlock ()      { LeaveCriticalSection      (&m_criticalSection); }
    
virtual ~CLock()    { DeleteCriticalSection     (&m_criticalSection); }
private:
    CRITICAL_SECTION                    m_criticalSection;
}
;


// Scoped MT-exclusive lock
class CScopedLocker {
public:
    CScopedLocker (CLock 
* t) : m_lock (t)      { m_lock->Lock();   }
    
~CScopedLocker()                            { m_lock->Unlock(); }
private:
    CLock 
*                             m_lock;
}
;

// ¶ÔÈ«¾ÖµÄ±äÁ¿£¬Ê¹ÓÃCritical Section
// Declare the global variable
static int  g_n;
CritSect sect;
//CLock t;



////////Thread One Function///////////////////
UINT ThreadOne(LPVOID lParam)
{
    
    Lock 
lock(sect);    
    
//CScopedLocker st(&t);
    
    
for(int i=0;i<100;i++)
    
{
        g_n
++;
        cout 
<< "Thread 1: " << g_n << "\n";
    }
        
    
// return the thread
    return 0;
}



////////Thread Two Function///////////////////
UINT ThreadTwo(LPVOID lParam)
{


    Lock 
lock(sect);
    
//CScopedLocker st(&t);

    
for(int i=300;i<400;i++)
    
{
        g_n
++;
        cout 
<< "Thread 2: "<< g_n << "\n";
    }


    
// return the thread
    return 0;
}



int main()
{

    
// Create the array of Handle
    HANDLE hThrd[2];    
    
//Thread ID's
    DWORD IDThread1, IDThread2;


    
// Create thredas use CreateThread function with NULL Security
    hThrd[0= CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) ThreadOne,(LPVOID)NULL,0,&IDThread1);       
    hThrd[
1= CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) ThreadTwo,(LPVOID)NULL,0,&IDThread2); 

    
// Wait for the main thread 
    WaitForMultipleObjects(2,hThrd,TRUE,INFINITE);
    
    
return 0;
}


四 API列表:
Critical-section function Description
DeleteCriticalSection Releases all resources used by an unowned critical section object.
EnterCriticalSection Waits for ownership of the specified critical section object.
InitializeCriticalSection Initializes a critical section object.
InitializeCriticalSectionAndSpinCount Initializes a critical section object and sets the spin count for the critical section.
InitializeCriticalSectionEx Initializes a critical section object with a spin count and optional flags.
LeaveCriticalSection Releases ownership of the specified critical section object.
SetCriticalSectionSpinCount Sets the spin count for the specified critical section.
TryEnterCriticalSection Attempts to enter a critical section without blocking.

posted on 2007-07-25 18:04 夢在天涯 閱讀(6119) 評論(0)  編輯 收藏 引用 所屬分類: CPlusPlus

公告

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

搜索

  •  

積分與排名

  • 積分 - 1812199
  • 排名 - 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>
              久久久久久久久久码影片| 激情亚洲一区二区三区四区| 亚洲欧美日韩天堂一区二区| 一二三区精品| 亚洲欧美日本国产专区一区| 中文av字幕一区| 在线亚洲美日韩| 亚洲欧美精品在线| 久久精品日产第一区二区三区 | 欧美不卡一区| 蜜臀久久99精品久久久久久9| 老司机成人在线视频| 欧美国产日韩xxxxx| 欧美激情视频免费观看| 亚洲国产精品传媒在线观看| 亚洲国产视频一区| 夜夜精品视频一区二区| 亚洲欧美日韩国产精品| 久久激情视频免费观看| 久热精品视频在线观看一区| 欧美日韩免费一区二区三区视频| 国产精品色午夜在线观看| 一区二区在线免费观看| 洋洋av久久久久久久一区| 欧美一区二区三区在线观看视频| 免费在线看成人av| 一区二区三区免费看| 久久久久久久999精品视频| 欧美日韩亚洲一区在线观看| 国产自产v一区二区三区c| 一区二区三区久久精品| 久久综合给合| 一区二区日韩精品| 女同性一区二区三区人了人一 | 久久精品人人做人人综合| 亚洲春色另类小说| 欧美一区二区三区在线免费观看| 久久岛国电影| 亚洲免费大片| 免费看的黄色欧美网站| 国产九九精品视频| 99国产精品99久久久久久| 久久久噜噜噜久久| 亚洲一区三区电影在线观看| 欧美激情在线| 亚洲国产精品一区二区久| 欧美一区二区三区免费观看视频 | 久久琪琪电影院| 一本久久a久久精品亚洲| 可以看av的网站久久看| 国产性做久久久久久| 亚洲欧美日韩在线播放| 亚洲精品日韩久久| 欧美成人精品福利| 亚洲精品久久久一区二区三区| 久久久久久一区| 欧美一级成年大片在线观看| 国产精品日韩二区| 欧美亚洲自偷自偷| 亚洲一级黄色片| 国产精品实拍| 欧美一区二区三区免费视频| 亚洲精品免费在线观看| 欧美成人亚洲成人| 日韩视频亚洲视频| 亚洲日本免费| 欧美日韩另类字幕中文| 亚洲午夜高清视频| 中文av一区二区| 国产欧美日本一区视频| 欧美主播一区二区三区美女 久久精品人| 最近中文字幕mv在线一区二区三区四区| 免费在线欧美视频| 一区二区高清视频在线观看| 亚洲人成在线观看| 国产精品va在线播放| 午夜精品在线看| 欧美亚洲视频一区二区| 国产一区日韩欧美| 欧美国产在线观看| 欧美日韩aaaaa| 久久本道综合色狠狠五月| 久久久久国产精品麻豆ai换脸| 亚洲大片在线观看| 日韩天天综合| 国产一区二区三区四区| 榴莲视频成人在线观看| 欧美成人一区二区三区| 中文亚洲欧美| 久久不射电影网| 99精品国产在热久久婷婷| 亚洲小少妇裸体bbw| 国产一区二区丝袜高跟鞋图片| 欧美成人免费全部| 国产精品大片免费观看| 久久综合精品一区| 欧美日韩精品一区| 精品动漫3d一区二区三区免费| 久久久av网站| 欧美精品一区二区视频| 香蕉久久a毛片| 男女激情久久| 久久成人免费日本黄色| 欧美精品高清视频| 久久国产精品99久久久久久老狼| 蜜桃精品久久久久久久免费影院| 亚洲欧美精品中文字幕在线| 久久久久国产一区二区三区| 这里是久久伊人| 欧美在线www| 一区二区三区欧美| 美女视频网站黄色亚洲| 性8sex亚洲区入口| 欧美激情亚洲一区| 久久综合伊人77777麻豆| 欧美三级小说| 欧美成人国产va精品日本一级| 国产精品极品美女粉嫩高清在线| 欧美成人午夜免费视在线看片| 国产精品美女久久久浪潮软件| 91久久黄色| 韩日欧美一区二区三区| 亚洲精选91| 亚洲精品欧美极品| 久久久中精品2020中文| 欧美在线视频免费观看| 欧美日韩亚洲激情| 亚洲国产乱码最新视频| 黄色成人av网站| 午夜精品久久久99热福利| 亚洲一区三区电影在线观看| 欧美 日韩 国产一区二区在线视频| 久久精品成人一区二区三区 | 在线观看日韩www视频免费| 亚洲免费在线播放| 亚洲免费一级电影| 欧美日韩亚洲免费| av成人天堂| 亚洲夜晚福利在线观看| 欧美日韩一区二区三区| 99视频精品免费观看| 日韩午夜免费| 欧美精品久久久久久久| 亚洲人成高清| 在线中文字幕一区| 欧美日韩综合在线免费观看| 在线中文字幕日韩| 午夜精品剧场| 国产三级精品三级| 久久久夜精品| 亚洲激情视频在线播放| 日韩亚洲不卡在线| 国产精品xvideos88| 亚洲男女毛片无遮挡| 久久精品二区| 亚洲黄色精品| 欧美人在线观看| 日韩一区二区精品| 久久av在线看| 亚洲风情亚aⅴ在线发布| 美女亚洲精品| 一本色道88久久加勒比精品| 午夜精品一区二区三区在线播放 | 美女精品国产| 欧美电影免费观看| 亚洲精品国产视频| 国产精品成人免费| 欧美中文在线视频| 欧美激情精品久久久| 亚洲视频1区2区| 国产区二精品视| 久久久久久夜| 一区二区三区毛片| 免费视频一区| 亚洲欧美日韩国产综合| 亚洲国产精品久久久久婷婷老年| 欧美四级伦理在线| 久久精品国产99国产精品澳门 | 亚洲欧美日韩区| 免费成人av在线| 亚洲在线免费观看| 在线看日韩欧美| 国产精品久久久久久久久果冻传媒 | 欧美一区国产一区| 亚洲激情国产| 国产视频久久| 欧美日本韩国一区二区三区| 午夜视频一区| 亚洲美女啪啪| 裸体歌舞表演一区二区| 亚洲欧美日韩综合| 亚洲精品在线二区| 狠狠色噜噜狠狠色综合久 | 欧美精品精品一区| 久久国产精品一区二区三区| 亚洲精品视频一区| 欧美刺激性大交免费视频| 欧美一级在线亚洲天堂| 亚洲天堂黄色| 亚洲激精日韩激精欧美精品|