zoukankan      html  css  js  c++  java
  • MSDN上的Mutex代码及其执行结果

    MSDN上的Mutex代码及其执行结果

    #include <windows.h>
    #include <stdio.h>
    
    #define THREADCOUNT 2
    
    HANDLE ghMutex; 
    
    DWORD WINAPI WriteToDatabase( LPVOID );
    
    int main( void )
    {
        HANDLE aThread[THREADCOUNT];
        DWORD ThreadID;
        int i;
    
        // Create a mutex with no initial owner
    
        ghMutex = CreateMutex( 
            NULL,              // default security attributes
            FALSE,             // initially not owned
            NULL);             // unnamed mutex
    
        if (ghMutex == NULL) 
        {
            printf("CreateMutex error: %d\n", GetLastError());
            return 1;
        }
    
        // Create worker threads
    
        for( i=0; i < THREADCOUNT; i++ )
        {
            aThread[i] = CreateThread( 
                         NULL,       // default security attributes
                         0,          // default stack size
                         (LPTHREAD_START_ROUTINE) WriteToDatabase, 
                         NULL,       // no thread function arguments
                         0,          // default creation flags
                         &ThreadID); // receive thread identifier
    
            if( aThread[i] == NULL )
            {
                printf("CreateThread error: %d\n", GetLastError());
                return 1;
            }
        }
    
        // Wait for all threads to terminate
    
        WaitForMultipleObjects(THREADCOUNT, aThread, TRUE, INFINITE);
    
        // Close thread and mutex handles
    
        for( i=0; i < THREADCOUNT; i++ )
            CloseHandle(aThread[i]);
    
        CloseHandle(ghMutex);
    
        return 0;
    }
    
    DWORD WINAPI WriteToDatabase( LPVOID lpParam )
    { 
        // lpParam not used in this example
        UNREFERENCED_PARAMETER(lpParam);
    
        DWORD dwCount=0, dwWaitResult; 
    
        // Request ownership of mutex.
    
        while( dwCount < 20 )
        { 
            dwWaitResult = WaitForSingleObject( 
                ghMutex,    // handle to mutex
                INFINITE);  // no time-out interval
     
            switch (dwWaitResult) 
            {
                // The thread got ownership of the mutex
                case WAIT_OBJECT_0: 
                    __try { 
                        // TODO: Write to the database
                        printf("Thread %d writing to database...\n", 
                                GetCurrentThreadId());
                        dwCount++;
                    } 
    
                    __finally { 
                        // Release ownership of the mutex object
                        if (! ReleaseMutex(ghMutex)) 
                        { 
                            // Handle error.
                        } 
                    } 
                    break; 
    
                // The thread got ownership of an abandoned mutex
                // The database is in an indeterminate state
                case WAIT_ABANDONED: 
                    return FALSE; 
            }
        }
        return TRUE; 
    }

    Thread 736 writing to database...
    Thread 736 writing to database...
    Thread 736 writing to database...
    Thread 736 writing to database...
    Thread 736 writing to database...
    Thread 736 writing to database...
    Thread 736 writing to database...
    Thread 736 writing to database...
    Thread 736 writing to database...
    Thread 736 writing to database...
    Thread 2504 writing to database...
    Thread 736 writing to database...
    Thread 2504 writing to database...
    Thread 736 writing to database...
    Thread 2504 writing to database...
    Thread 736 writing to database...
    Thread 2504 writing to database...
    Thread 736 writing to database...
    Thread 2504 writing to database...
    Thread 736 writing to database...
    Thread 2504 writing to database...
    Thread 736 writing to database...
    Thread 2504 writing to database...
    Thread 736 writing to database...
    Thread 2504 writing to database...
    Thread 736 writing to database...
    Thread 2504 writing to database...
    Thread 736 writing to database...
    Thread 2504 writing to database...
    Thread 736 writing to database...
    Thread 2504 writing to database...
    Thread 2504 writing to database...
    Thread 2504 writing to database...
    Thread 2504 writing to database...
    Thread 2504 writing to database...
    Thread 2504 writing to database...
    Thread 2504 writing to database...
    Thread 2504 writing to database...
    Thread 2504 writing to database...
    Thread 2504 writing to database...
    请按任意键继续. . .

    dwCount 为 20,每个线程执行20次。

  • 相关阅读:
    Malware Sample Sources for Researchers
    How to Allow MySQL Client to Connect to Remote MySQL server
    指標和函數
    ”十六“进制查看器
    解決svchost.exe 100%的問題 (真的中毒了)
    C#中Class与Struct区别
    js获取asp.net服务器端控件Label,TextBox,RadioButtonList,DropDownList的值
    大象之UML (一) 准备
    大象之UMl(二)UML核心元素
    配置.NET运行环境
  • 原文地址:https://www.cnblogs.com/lihaozy/p/2548465.html
Copyright © 2011-2022 走看看