1. 创建进程锁lock_object_, 方法内防止死锁的进程锁使用
ACE_Process_Mutex* lock_object_ ;
ACE_NEW_RETURN( lock_object_, ACE_Process_Mutex( queue_lock_name_ ), -1 );
ACE_Process_Mutex* lock_;
lock_ = lock_object;
使用
int __stdcall func(void* item)
{
ACE_GUARD_RETURN( LOCK, guard, *lock_, -1 );
...同步代码
}
ACE_GUARD_RETURN( LOCK, guard, *lock_, -1 );
#define ACE_GUARD_ACTION(MUTEX, OBJ, LOCK, ACTION, REACTION) \
ACE_Guard< MUTEX > OBJ (LOCK); \
if (OBJ.locked () != 0) { ACTION; } \
else { REACTION; }
3. 线程锁
#include "stdafx.h"
#include "ace/ace.h"
#include "ace/Thread.h"
#include "ace/Synch.h"
#include "ace/Log_Msg.h"
ACE_Thread_Mutex tmMutex;
int g_nCounter;
//子线程处理函数,在此函数中采用mutex保证每次打印三个连续的整数
//中间的输出不会被打断
static void* ChildProc(void* pParam)
{
//如果没有mutext,输出结果将会有很大的不同,无法保证输出的完整性!
ACE_Guard<ACE_Thread_Mutex> gdSync(tmMutex);
for (int i = 0; i < 3;i++)
{
ACE_DEBUG((LM_DEBUG,ACE_TEXT("(%t) = %d/n"),g_nCounter++));
}
return NULL;
}
//创建的线程个数
#define NUM_THRD 100
int ACE_TMAIN(int argc, ACE_TCHAR* argv[])
{
ACE_thread_t* pThreadIDs = new ACE_thread_t[NUM_THRD];
ACE_hthread_t* pHandles = new ACE_hthread_t[NUM_THRD];
//启动NUM_THRD个线程
if (ACE_Thread::spawn_n(pThreadIDs,NUM_THRD,(ACE_THR_FUNC)ChildProc,0,
THR_JOINABLE|THR_NEW_LWP,
ACE_DEFAULT_THREAD_PRIORITY,
0,0,
pHandles) == -1
)
{
ACE_DEBUG((LM_DEBUG,ACE_TEXT("spawn_n error!/n")));
return -1;
}
//等待所有的子线程处理完毕,主线程才退出
for (int i = 0; i < NUM_THRD;i++)
{
ACE_Thread::join(pHandles[i]);
}
return 0;
}