亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? cmclmonitor.cpp

?? window下的多線程編程參考書。值得一讀
?? CPP
字號:
//
// FILE: CMclMonitor.cpp
//
// Copyright (c) 1997 by Aaron Michael Cohen and Mike Woodring
//
/////////////////////////////////////////////////////////////////////////

#include "CMclMonitor.h"

//////////////////////////////////////////////////
// CMclCondition abstract base class            //
//////////////////////////////////////////////////

// constructor initializes an auto-reset event...
CMclCondition::CMclCondition() : m_cEvent(FALSE) {
    return;
}

// virtual destructor does nothing, is simply a placeholder
CMclCondition::~CMclCondition() {
    return;
}

void CMclCondition::WaitForEvent(void) {
    m_cEvent.Wait(INFINITE);
}

void CMclCondition::SignalEvent(void) {
    // it is very important the the event be set here and not
    // pulsed. there is a small time window inside WaitForCondition()
    // between where the event might be signaled before the thread
    // calls WaitForEvent(). anyway, this is an auto-reset event so the
    // signal state will be cleared after the thread resumes...
    m_cEvent.Set();
}

/////////////////////////////////////////////////////
// CMclMonitor::CMclConditionNode utility class    //
/////////////////////////////////////////////////////
CMclMonitor::CMclConditionNode::CMclConditionNode( CMclCondition *pcCondition) {
    m_pcCondition = pcCondition;
    m_pcnNext = NULL;
    m_pcnPrev = NULL;
}

///////////////////////////
// CMclMonitor class     //
///////////////////////////
CMclMonitor::CMclMonitor() : m_cnMaster(NULL), m_cnFree(NULL), 
                            m_csMutex(1,1), m_dwStatus(NO_ERROR) {
    CMCL_CHECK_CREATION_STATUS(m_csMutex.Status(), m_dwStatus);
    m_cnMaster.m_pcnNext = m_cnMaster.m_pcnPrev = &m_cnMaster;
    m_cnFree.m_pcnNext = m_cnFree.m_pcnPrev = &m_cnFree;
    return;
}

CMclMonitor::~CMclMonitor() {
    Cleanup();
}

void CMclMonitor::Enter(void) {
    m_csMutex.Wait(INFINITE);
}

void CMclMonitor::Leave(void) {
    LeaveAndScanConditions();
}

BOOL CMclMonitor::WaitForCondition( CMclCondition *pcCondition) {
    if (pcCondition->Condition() == FALSE) {
        // the condition is FALSE, so we'll put the
        // condition on the monitor list...
        
        // create a new list node...
        CMclConditionNode *pNewNode = AllocateNodeForCondition(pcCondition);
        if (pNewNode == NULL) {
            // this is a memory allocation failure...
            CMclThrowError(ERROR_OUTOFMEMORY);
            return FALSE;
        }

        // put the node on the list...
        AppendConditionNode(pNewNode);

        // leave the monitor by resuming a waiting
        // thread or just releasing the semaphore...
        // this could cause other threads to execute
        // which might release our condition event
        // before we even get a chance to wait for it,
        // therefore the event must be set and not
        // pulsed in CMclCondition::SignalEvent()...
        LeaveAndScanConditions();

        // wait for the event...
        pcCondition->WaitForEvent();
    }
    
    return TRUE;
}

void CMclMonitor::LeaveAndScanConditions(void) {
    // traverse the list of CMclConditionNodes,
    // looking for a condition which is TRUE...
    CMclConditionNode *pNode = m_cnMaster.m_pcnNext;
    while (pNode != &m_cnMaster) {
        if (pNode->m_pcCondition->Condition()) {
            break;
        }
        pNode = pNode->m_pcnNext;
    }

    if (pNode != &m_cnMaster) {
        // we have found a node with a true condition,
        // remove the node and signal the condition...
        CMclCondition *pcCondition = pNode->m_pcCondition;
        RemoveConditionNode(pNode);
        AddToFreeList(pNode);
        pcCondition->SignalEvent();
    }
    else {
        // no nodes are ready to be signaled, so just
        // release the mutual exclusion semaphore...
        m_csMutex.Release(1);
    }
}

void CMclMonitor::AppendConditionNode( CMclConditionNode *pcnNewNode) {
    m_cnMaster.m_pcnPrev->m_pcnNext = pcnNewNode;
    pcnNewNode->m_pcnPrev = m_cnMaster.m_pcnPrev;
    m_cnMaster.m_pcnPrev = pcnNewNode;
    pcnNewNode->m_pcnNext = &m_cnMaster;
}

void CMclMonitor::RemoveConditionNode( CMclConditionNode *pcnOldNode) {
    pcnOldNode->m_pcnPrev->m_pcnNext = pcnOldNode->m_pcnNext;
    pcnOldNode->m_pcnNext->m_pcnPrev = pcnOldNode->m_pcnPrev;
}

void CMclMonitor::AddToFreeList(CMclConditionNode *pcnFreeNode) {
    // reinitialize the node's condition...
    pcnFreeNode->m_pcCondition = NULL;

    // add the node to the free list...
    m_cnFree.m_pcnPrev->m_pcnNext = pcnFreeNode;
    pcnFreeNode->m_pcnPrev = m_cnFree.m_pcnPrev;
    m_cnFree.m_pcnPrev = pcnFreeNode;
    pcnFreeNode->m_pcnNext = &m_cnFree;
}

CMclMonitor::CMclConditionNode *CMclMonitor::AllocateNodeForCondition(CMclCondition *pcCondition) {
    CMclConditionNode *pNode = m_cnFree.m_pcnNext;
    if (pNode != &m_cnFree) {
        // if there are any nodes on the list,
        // remove the first one from the list to use...
        pNode->m_pcnPrev->m_pcnNext = pNode->m_pcnNext;
        pNode->m_pcnNext->m_pcnPrev = pNode->m_pcnPrev;
        pNode->m_pcCondition = pcCondition;
        pNode->m_pcnPrev = pNode;
        pNode->m_pcnNext = pNode;
    }
    else {
        // otherwise allocate a new one...
        pNode = new CMclConditionNode(pcCondition);
    }

    // return the initialized node...
    return pNode;
}

void CMclMonitor::Cleanup(void) {
    // traverse the list of active condition nodes,
    // deleting each node...
    CMclConditionNode *pNode = m_cnMaster.m_pcnNext;
    while (pNode != &m_cnMaster) {
        CMclConditionNode *pOldNode = pNode;
        pNode = pNode->m_pcnNext;
        delete pOldNode;
    }

    // traverse the list of free nodes,
    // deleting each node...
    pNode = m_cnFree.m_pcnNext;
    while (pNode != &m_cnFree) {
        CMclConditionNode *pOldNode = pNode;
        pNode = pNode->m_pcnNext;
        delete pOldNode;
    }
}

DWORD CMclMonitor::Status(void) const {
    return m_dwStatus;
}




?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久国产夜色精品鲁鲁99| 亚洲狼人国产精品| 91麻豆精品国产自产在线观看一区| 国产精品亚洲视频| 久久av中文字幕片| 青草国产精品久久久久久| 亚洲午夜一二三区视频| 亚洲一区在线观看视频| 亚洲精选视频在线| 亚洲综合激情另类小说区| 亚洲精品乱码久久久久久久久 | 一区二区在线免费观看| 中文字幕中文字幕中文字幕亚洲无线| 久久久精品中文字幕麻豆发布| 精品日韩av一区二区| 久久久久免费观看| 中文字幕欧美国产| 丝袜美腿亚洲综合| 亚洲高清在线视频| 日韩电影在线看| 国产一区二区三区四区五区入口| 国产在线不卡视频| www.亚洲激情.com| 欧美日韩在线免费视频| 日韩精品一区二区三区在线观看| 99热这里都是精品| 国产视频不卡一区| 一区二区三区精品视频在线| 亚洲黄网站在线观看| 五月综合激情婷婷六月色窝| 久久国内精品视频| 粉嫩aⅴ一区二区三区四区五区| 成人app下载| 欧美美女bb生活片| 久久天堂av综合合色蜜桃网| 亚洲视频 欧洲视频| 午夜精品福利一区二区三区av| 精品一区二区日韩| 91女厕偷拍女厕偷拍高清| 制服视频三区第一页精品| 久久亚洲精精品中文字幕早川悠里| 国产欧美视频在线观看| 亚洲午夜免费电影| 国产成人av电影在线观看| 成人av动漫网站| 欧美色综合久久| 国产亚洲欧美日韩日本| 一区二区三区四区在线免费观看 | 亚洲黄色小视频| 久久精品久久综合| 欧美日韩视频专区在线播放| 久久久久国产精品麻豆| 亚洲午夜成aⅴ人片| 国产经典欧美精品| 精品美女在线观看| 午夜伊人狠狠久久| 色一情一乱一乱一91av| 日本一区二区综合亚洲| 午夜视频在线观看一区二区 | 国产激情视频一区二区三区欧美| 欧美亚洲另类激情小说| 中文字幕一区视频| 激情另类小说区图片区视频区| 欧美日韩国产综合久久| 亚洲女同一区二区| 97se亚洲国产综合自在线不卡| 久久久久久久久97黄色工厂| 亚洲成人动漫av| 欧美影院午夜播放| 亚洲精品视频在线看| 91欧美激情一区二区三区成人| 国产网站一区二区| 国产一区二区三区在线观看精品 | 亚洲三级视频在线观看| 懂色av一区二区夜夜嗨| 国产欧美日韩另类一区| 丰满放荡岳乱妇91ww| 久久久一区二区三区| 久久99精品国产| 2023国产精品自拍| 国产精品白丝av| 久久久久久久久久看片| 国产乱码一区二区三区| 久久久.com| 欧美午夜精品久久久久久孕妇| 亚洲男人的天堂在线aⅴ视频| 成人免费视频一区二区| 国产精品视频九色porn| www.亚洲色图| 亚洲成人免费视频| 欧美一区二区日韩| 国产成人在线电影| 综合色天天鬼久久鬼色| 欧美亚洲国产怡红院影院| 亚洲第一av色| 精品久久久久久久久久久久久久久| 久久不见久久见中文字幕免费| 日韩精品一区二区在线观看| 国产精品123| 一区二区三区四区精品在线视频| 欧美丝袜自拍制服另类| 免费不卡在线观看| 国产精品国产三级国产aⅴ原创| 91碰在线视频| 欧美a级理论片| 欧美激情综合五月色丁香 | 亚洲一卡二卡三卡四卡无卡久久| 欧美人牲a欧美精品| 久久国内精品自在自线400部| 国产欧美一区二区精品性色 | 亚洲色图欧洲色图婷婷| 欧美日韩免费一区二区三区视频| 久久精品久久综合| 亚洲天堂网中文字| 日韩欧美区一区二| 91丨porny丨在线| 久久精品国产99国产精品| 国产精品色在线观看| 欧美性xxxxxx少妇| 国产91丝袜在线播放九色| 亚洲成国产人片在线观看| 久久久久久电影| 欧美剧情片在线观看| 成人黄动漫网站免费app| 免费人成精品欧美精品| 一区在线观看免费| 精品国产a毛片| 欧美日韩国产色站一区二区三区| 国产盗摄一区二区三区| 日韩一区精品视频| 亚洲欧美一区二区在线观看| 欧美成人三级电影在线| 欧美日韩国产综合久久| 99re亚洲国产精品| 国产v综合v亚洲欧| 国产一区二区三区免费| 日韩电影免费在线看| 一区二区三区四区不卡视频| 国产亚洲美州欧州综合国| 91精品国产综合久久久久久 | 欧美日韩久久久一区| 99久久久精品| 成人黄色大片在线观看| 国产一区二区91| 蜜桃精品在线观看| 午夜精品福利在线| 亚洲bdsm女犯bdsm网站| 亚洲一区二区av电影| 亚洲美女在线国产| 亚洲免费观看高清完整版在线| 中文字幕精品一区二区精品绿巨人 | 亚洲国产成人高清精品| 中文字幕中文在线不卡住| 国产无一区二区| 国产性做久久久久久| 久久综合久久99| 欧美精品一区二区蜜臀亚洲| 欧美一区二区在线播放| 欧美一区二区视频在线观看| 欧美日韩亚洲综合一区| 欧美日韩国产天堂| 91精品国产综合久久香蕉的特点| 欧美久久久久免费| 制服丝袜av成人在线看| 日韩一区二区免费视频| 精品久久人人做人人爰| 亚洲精品一区二区三区四区高清| 欧美va天堂va视频va在线| 久久在线观看免费| 中文字幕av资源一区| 亚洲日本va午夜在线影院| 一区二区三区久久| 免费看欧美美女黄的网站| 黄色资源网久久资源365| 成人中文字幕合集| 在线观看av一区| 欧美一区二区日韩| 欧美韩国日本不卡| 亚洲国产精品人人做人人爽| 蜜臀av性久久久久蜜臀aⅴ流畅| 国产成人综合亚洲91猫咪| 色综合天天视频在线观看| 91精品国产高清一区二区三区 | 欧美狂野另类xxxxoooo| 欧美刺激午夜性久久久久久久| 国产欧美一区二区精品性色超碰 | 婷婷成人激情在线网| 激情六月婷婷综合| 日本韩国欧美国产| 日韩精品一区二区三区视频| 国产午夜亚洲精品午夜鲁丝片| 亚洲精品视频自拍| 国内国产精品久久| 91福利国产成人精品照片| 日韩欧美一卡二卡| 亚洲最新在线观看| 国产综合成人久久大片91| 91网站在线播放| 久久久综合精品| 日韩av一级片|