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

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

搜索

  •  

積分與排名

  • 積分 - 1812168
  • 排名 - 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电影| 亚洲精品免费在线播放| 欧美性事在线| 亚洲精品一区在线观看香蕉| 国产精品久久午夜夜伦鲁鲁| 亚洲一区久久| 激情五月***国产精品| 欧美特黄a级高清免费大片a级| a4yy欧美一区二区三区| 一区二区三区四区五区在线| 欧美网站大全在线观看| 久久久www成人免费无遮挡大片| 欧美一区免费视频| 久久久久久91香蕉国产| 欧美二区乱c少妇| 91久久精品国产91久久| 在线性视频日韩欧美| 香蕉成人啪国产精品视频综合网| 性欧美18~19sex高清播放| 久久国产一区二区三区| 中文av一区特黄| 午夜精品免费在线| 91久久在线| 久久久久久夜精品精品免费| 亚洲精品免费在线| 韩国成人福利片在线播放| 亚洲美女一区| 久久一区免费| 西西人体一区二区| 欧美精品手机在线| 韩国精品主播一区二区在线观看| 午夜亚洲伦理| 亚洲天堂免费观看| 欧美性色aⅴ视频一区日韩精品| 1769国产精品| 欧美高清在线视频观看不卡| 久久精品一二三区| 亚洲国产裸拍裸体视频在线观看乱了中文 | 久久在线免费观看| 亚洲一级二级| 国产精品专区第二| 久久综合一区| 免费视频久久| 午夜欧美电影在线观看| 亚洲天堂av图片| 国产一级一区二区| 欧美二区乱c少妇| 欧美精品乱人伦久久久久久 | 欧美a级大片| 亚洲一区二区在线免费观看视频 | 国产精品区二区三区日本| 欧美一区二区三区视频在线观看| 亚洲国产精品久久久久久女王| 久久久97精品| 欧美成人午夜免费视在线看片| 18成人免费观看视频| 亚洲欧美精品在线观看| 午夜精品久久久久久久| 欧美日本中文字幕| 99精品视频免费观看视频| 欧美国产高清| 鲁大师成人一区二区三区| 国产欧美精品日韩| 亚洲一区影院| 久久成人精品无人区| 亚洲电影免费观看高清完整版在线观看| 亚洲欧美国内爽妇网| 一区二区三区黄色| 国产午夜精品全部视频播放| 亚洲网站啪啪| 性一交一乱一区二区洋洋av| 极品少妇一区二区| 99视频一区| 亚洲国产清纯| 艳女tv在线观看国产一区| 国产网站欧美日韩免费精品在线观看 | 久久久午夜电影| 欧美日韩精品一区二区三区四区| 在线观看欧美日韩| 先锋亚洲精品| 一区二区三区导航| 蜜臀av在线播放一区二区三区| 亚洲少妇中出一区| 麻豆91精品| 久久高清福利视频| 国产精品成人一区二区三区夜夜夜| 欧美在线观看视频一区二区| 欧美一区成人| 影院欧美亚洲| 亚洲精品乱码久久久久久蜜桃麻豆 | 一区二区三区在线观看欧美| 亚洲成色777777女色窝| 欧美三区美女| 裸体歌舞表演一区二区| 欧美日韩国产色视频| 久久精品女人天堂| 欧美日韩18| 老司机精品视频网站| 欧美日韩亚洲综合| 欧美va天堂va视频va在线| 欧美日韩国产成人高清视频| 久久午夜视频| 国产精品白丝jk黑袜喷水| 欧美aa在线视频| 国产欧美91| 99日韩精品| 在线免费观看日韩欧美| 亚洲一区二区不卡免费| 亚洲精品网站在线播放gif| 欧美一区二区三区免费视| 亚洲作爱视频| 麻豆成人综合网| 欧美在线播放视频| 欧美视频一区| 亚洲老司机av| 亚洲另类视频| 欧美sm视频| 欧美超级免费视 在线| 国产一区二区高清视频| 亚洲午夜久久久久久尤物| 亚洲美女视频在线观看| 免费亚洲电影| 欧美丰满高潮xxxx喷水动漫| 国产欧美精品一区二区色综合| 一区二区av| 亚洲一区欧美一区| 欧美日韩亚洲不卡| 99成人精品| 亚洲一区在线看| 国产精品久久久久久久久久妞妞| 亚洲精品国产日韩| 亚洲精品久久视频| 红桃视频亚洲| 国产区欧美区日韩区| 欧美新色视频| 欧美日韩一级视频| 久久久久亚洲综合| 美女网站久久| 欧美sm极限捆绑bd| 久久国产精品99精品国产| 国产精品看片资源| 久久久亚洲人| 伊人蜜桃色噜噜激情综合| 欧美在线一二三区| 美日韩精品免费| 亚洲大胆人体视频| 欧美激情亚洲一区| 一区二区三欧美| 性色一区二区三区| 激情成人亚洲| 欧美国产丝袜视频| 亚洲深夜福利在线| 久久裸体艺术| 日韩午夜在线电影| 国产精品网站一区| 久久久亚洲一区| 亚洲精品人人| 久久久999精品| 亚洲精品自在在线观看| 欧美三日本三级少妇三2023| 亚洲午夜国产一区99re久久 | 国产精品区二区三区日本| 欧美制服第一页| 亚洲欧洲日本mm| 欧美一区精品| 日韩午夜一区| 国产一区久久| 欧美视频在线观看免费网址| 欧美一区亚洲| 亚洲精品国产系列| 久久狠狠亚洲综合| 中文一区字幕| 国内视频一区| 欧美日韩高清免费| 久久精品人人做人人爽电影蜜月| 欧美sm视频| 久久精品人人做人人综合| 99这里只有久久精品视频| 国产一区二区三区无遮挡| 欧美性猛交xxxx乱大交蜜桃| 久久嫩草精品久久久精品| 亚洲深夜激情| 亚洲日韩视频| 欧美激情在线播放| 久久久久久国产精品mv| 亚洲自拍电影| 一区二区三区黄色| 亚洲国产一区二区三区a毛片| 国产精品乱子久久久久| 欧美激情网站在线观看| 蜜桃av久久久亚洲精品| 欧美在线免费观看视频|