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

  • 相关阅读:
    [GO] go使用etcd和watch方法进行实时的配置变更
    [GO]go context的deadline方法
    [GO]go使用contextCancel
    [GO]go使用etcd
    js控制复选框checkbox 只能单选
    JQuery.Ajax之错误调试帮助信息
    SQLServer2005创建定时作业任务
    JS/JQuery针对不同类型元素的操作(radio、select、checkbox)
    SQL Server跨库查询
    javax.net.ssl.SSLHandshakeException(Cas导入证书)
  • 原文地址:https://www.cnblogs.com/lihaozy/p/2548465.html
Copyright © 2011-2022 走看看