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次。

  • 相关阅读:
    shell编程-基础
    磁盘管理-下部
    磁盘管理-中部
    磁盘管理-上部
    用户的管理
    docker之阿里云centos 7.x 启动容器报错处理办法
    IDEA之整合SVN遇到的坑(一)
    springboot之通过idea打jar包并运行
    SpringBoot整合定时任务和异步任务处理
    Microsoft SQL Server 2012安装说明
  • 原文地址:https://www.cnblogs.com/lihaozy/p/2548465.html
Copyright © 2011-2022 走看看