zoukankan      html  css  js  c++  java
  • windows系统调用 互斥体mutex

     1 #include "iostream"
     2 #include "windows.h"
     3 using namespace std;
     4 
     5 class CCountUpDown{
     6 public:
     7     CCountUpDown(int nAccesses):
     8     m_hThreadInc(INVALID_HANDLE_VALUE),
     9         m_hThreadDec(INVALID_HANDLE_VALUE),
    10         m_hMutexValue(INVALID_HANDLE_VALUE),
    11         m_nValue(0),
    12         m_nAccess(nAccesses){
    13         m_hMutexValue=CreateMutex(
    14             NULL,
    15             TRUE,
    16             NULL
    17             );
    18         m_hThreadInc=CreateThread(
    19             NULL,
    20             0,
    21             IncThreadProc,
    22             reinterpret_cast<LPVOID>(this),
    23             0,
    24             NULL
    25             );
    26         m_hThreadDec=CreateThread(
    27             NULL,
    28             0,
    29             DecThreadProc,
    30             reinterpret_cast<LPVOID>(this),
    31             0,
    32             NULL
    33             );
    34         ReleaseMutex(m_hMutexValue);
    35     }
    36 
    37     virtual ~CCountUpDown(){
    38         CloseHandle(m_hThreadInc);
    39         CloseHandle(m_hThreadDec);
    40         CloseHandle(m_hMutexValue);
    41     }
    42 
    43     virtual void WaitForCompletion(){
    44         if(m_hThreadInc!=INVALID_HANDLE_VALUE&&m_hThreadDec!=INVALID_HANDLE_VALUE){
    45             WaitForSingleObject(m_hThreadInc,INFINITE);
    46             WaitForSingleObject(m_hThreadDec,INFINITE);
    47         }
    48     }
    49 
    50 protected:
    51     virtual void DoCount(int nStep){
    52         while(m_nAccess>0){
    53             WaitForSingleObject(m_hMutexValue,INFINITE);
    54 
    55             m_nValue+=nStep;
    56             printf("thread:%d valuem,value:%d access:%d
    ",GetCurrentThreadId(),m_nValue,m_nAccess);
    57             --m_nAccess;
    58             Sleep(500);
    59 
    60             ReleaseMutex(m_hMutexValue);
    61         }
    62     }
    63 
    64     static DWORD WINAPI IncThreadProc(LPVOID lpParam){
    65         CCountUpDown *pThis=reinterpret_cast<CCountUpDown*>(lpParam);
    66         pThis->DoCount(+1);
    67         return (0);
    68     }
    69 
    70     static DWORD WINAPI DecThreadProc(LPVOID lpParam){
    71         CCountUpDown*pThis=reinterpret_cast<CCountUpDown*>(lpParam);
    72         pThis->DoCount(-1);
    73         return(0);
    74     }
    75 
    76 protected:
    77     HANDLE m_hThreadInc;
    78     HANDLE m_hThreadDec;
    79     HANDLE m_hMutexValue;
    80     int m_nValue;
    81     int m_nAccess;
    82 };
    83 
    84 void main(){
    85     CCountUpDown ud(10);
    86     ud.WaitForCompletion();
    87     getchar();
    88 }
  • 相关阅读:
    java内存泄露
    hbase java api
    配置CRT远程登录
    kafka分区消费模型
    JAVA内存区域
    JVM分代和垃圾回收
    spring中bean的作用域
    分布式RPC
    session共享
    ZooKeeper实现分布式session
  • 原文地址:https://www.cnblogs.com/593213556wuyubao/p/3789074.html
Copyright © 2011-2022 走看看