mutex的使用

本文介绍了一个使用Mutex(互斥量)进行进程间同步的例子。通过创建互斥量并利用其在多个线程中保护对共享资源(如数据库写操作)的访问,确保了线程安全。演示了如何创建、等待、释放Mutex。

类似于临界区,但是可以在进程间同步。

 

ContractedBlock.gif ExpandedBlockStart.gif Code
#include <windows.h>
#include 
<stdio.h>

#define THREADCOUNT 2

HANDLE ghMutex; 

DWORD WINAPI WriteToDatabase( LPVOID );

void main()
{
    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;
    }

    
// 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;
        }
    }

    
// 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);
}

DWORD WINAPI WriteToDatabase( LPVOID 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; 
}

 

posted on 2009-11-21 12:40 迈克老狼 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/mikewolf2009/archive/2009/11/21/1607552.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值