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

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 夢在天涯 閱讀(6120) 評論(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

搜索

  •  

積分與排名

  • 積分 - 1816424
  • 排名 - 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>
              亚洲午夜在线观看视频在线| 欧美黄网免费在线观看| 久久理论片午夜琪琪电影网| 国产综合久久| 欧美成人精品高清在线播放| 一区二区成人精品| 久久精品视频免费| 在线欧美日韩精品| 欧美日韩伦理在线免费| 先锋亚洲精品| 欧美激情在线播放| 亚洲自啪免费| 黄色一区二区在线| 欧美日韩国产精品| 久久精品欧美| 日韩一区二区精品视频| 久久久蜜桃一区二区人| 亚洲精品国产欧美| 国产精品美女久久| 久久一区二区三区四区| 在线视频日本亚洲性| 久久中文字幕一区| 亚洲一区二区毛片| 在线看片成人| 国产精品色婷婷| 美女诱惑黄网站一区| 亚洲男人的天堂在线aⅴ视频| 欧美不卡三区| 久久精品2019中文字幕| 一区二区av在线| 伊人久久婷婷色综合98网| 欧美三级在线视频| 麻豆精品精华液| 欧美一区在线视频| 日韩午夜av| 欧美激情一区二区三区在线| 久久精品30| 亚洲小说欧美另类社区| 91久久国产精品91久久性色| 国产欧美一区二区精品秋霞影院| 欧美韩日视频| 老鸭窝毛片一区二区三区| 亚洲欧美卡通另类91av| 日韩一级欧洲| 亚洲精品久久久一区二区三区| 欧美在线视频一区二区| 亚洲在线观看视频| 99精品视频一区二区三区| 在线观看日韩av先锋影音电影院| 国产精品视频免费观看www| 欧美精品尤物在线| 欧美成人精品一区二区| 久久综合国产精品台湾中文娱乐网| 亚洲欧美日韩综合国产aⅴ| 一区二区激情小说| 99国产精品久久| 亚洲国产乱码最新视频| 亚洲承认在线| 欧美大片一区二区| 欧美大片专区| 欧美成人四级电影| 欧美成人免费全部| 欧美国产一区视频在线观看| 毛片精品免费在线观看| 鲁鲁狠狠狠7777一区二区| 久久精品国产77777蜜臀| 久久国产欧美日韩精品| 久久精品国产v日韩v亚洲| 久久精品一区二区三区中文字幕| 欧美一区二区三区啪啪| 性欧美1819性猛交| 久久国产精品99国产精| 久久精品视频播放| 另类av一区二区| 欧美丰满高潮xxxx喷水动漫| 欧美高清在线视频| 91久久久久久久久久久久久| 亚洲精品社区| 国产精品99久久99久久久二8 | 性色av一区二区三区| 午夜免费电影一区在线观看| 亚洲欧美日韩久久精品 | 久久精品国产精品亚洲精品| 久久国产一区二区| 麻豆91精品| 欧美黑人一区二区三区| 欧美色另类天堂2015| 国产精品自拍视频| 激情欧美一区| 日韩五码在线| 亚洲欧美日韩成人高清在线一区| 欧美一区二区视频在线| 久久综合久久综合九色| 亚洲品质自拍| 亚洲在线视频免费观看| 久久亚洲精品网站| 欧美日韩国产在线看| 国产啪精品视频| 亚洲激情专区| 亚洲欧美中文日韩v在线观看| 久久精品123| 亚洲国产婷婷综合在线精品| 亚洲一品av免费观看| 久久久久久欧美| 欧美日精品一区视频| 国产日产欧美精品| 亚洲免费av网站| 欧美一区日本一区韩国一区| 欧美第十八页| 亚洲影音一区| 欧美黄色一区| 国产一区二区三区四区在线观看 | 亚洲国产另类精品专区| 亚洲一区二区三区四区中文| 久久视频在线视频| 99精品欧美一区二区三区综合在线| 午夜精品在线| 欧美人与性禽动交情品| 黑人操亚洲美女惩罚| 亚洲一区二区三区免费观看| 欧美xart系列高清| 亚洲一区中文字幕在线观看| 欧美jjzz| 影音先锋亚洲一区| 午夜宅男欧美| 亚洲精品视频一区二区三区| 久久久久久久综合| 国产精品亚洲а∨天堂免在线| 亚洲日本欧美| 久久综合久色欧美综合狠狠| 亚洲小说区图片区| 欧美精品日韩一本| 亚洲国产高清在线| 久久久久久综合网天天| 亚洲无亚洲人成网站77777| 欧美精品免费在线| 亚洲国产天堂久久综合网| 久久九九久精品国产免费直播| 一区电影在线观看| 欧美激情精品久久久久久| 亚洲成人在线| 久久综合狠狠综合久久综合88| 亚洲永久免费观看| 国产精品久久久久999| 一本一本久久a久久精品综合麻豆 一本一本久久a久久精品牛牛影视 | 国产精品日韩一区| 在线视频亚洲欧美| 亚洲人成网在线播放| 欧美aⅴ99久久黑人专区| 在线观看日韩www视频免费 | 免费在线看成人av| 1024日韩| 久久综合五月天婷婷伊人| 欧美在线免费观看亚洲| 国产区精品在线观看| 欧美一区二区高清在线观看| 在线亚洲欧美| 国产精品嫩草99a| 亚洲欧美日韩精品久久亚洲区| 一区二区三区导航| 欧美视频一区二| 亚洲字幕在线观看| 亚洲天堂免费观看| 国产精品日韩| 久久国产一区| 久久动漫亚洲| 1024成人| 亚洲激情综合| 欧美午夜欧美| 欧美亚洲视频在线观看| 欧美一区三区二区在线观看| 国模精品娜娜一二三区| 蜜桃精品久久久久久久免费影院| 久久久久久999| 亚洲精品一区二区在线| 亚洲免费观看高清完整版在线观看| 欧美裸体一区二区三区| 亚洲一区在线观看视频| 午夜国产精品影院在线观看| 一区二区三区在线视频观看| 蜜臀久久99精品久久久画质超高清| 免费亚洲电影| 正在播放日韩| 欧美一区二区三区四区在线观看 | 日韩一区二区福利| 亚洲午夜激情| 狠狠色狠狠色综合日日tαg| 亚洲国产欧美日韩| 国产精品久久看| 美日韩在线观看| 欧美日韩在线不卡一区| 久久国产精品久久久久久久久久| 开心色5月久久精品| 一区二区日韩精品| 欧美伊人久久久久久午夜久久久久 | 久久精品视频在线看| 女女同性精品视频| 新狼窝色av性久久久久久| 久久久久五月天| 亚洲视频在线观看网站|