ACE 스레드의 ACEThread_Mutex 배제 잠금 장치

3051 단어 ACE
상호 배척체는 상호 배척(mutual exclusion) 동기화의 간단한 형식을 실현했다.상호 배척체는 여러 라인이 보호된 코드 임계 구역 (critical section) 에 동시에 들어가는 것을 금지합니다.따라서 임의의 시간에 하나의 라인만 이러한 코드 보호 구역에 들어갈 수 있다.
임계 구역에 들어가기 전에 acquire와 이 구역과 관련된 상호 배척체의 소유권을 가져야 합니다.만약 이미 다른 라인이 임계구 상호 배척체를 가지고 있다면 다른 라인은 더 이상 그 안에 들어갈 수 없다.이 스레드들은 현재 주 스레드가release를 방출하는 것을 알고 기다려야 합니다.
언제 상호 배척체를 사용해야 합니까?상호 배척체는 공유된 변환 코드, 즉 전역 또는 정적 데이터를 보호하는 데 사용된다.이러한 데이터는 여러 라인이 동시에 접근할 때 손상되지 않도록 상호 배척체를 통해 보호해야 한다. 
다음 예는 다음과 같습니다.
#include 
#include "ace/Synch.h"
#include "ace/Log_Msg.h"   //ace_debug
#include "ace/OS_NS_stdio.h"   ///ACE_OS::printf
#include "ace/Thread.h"

struct Args
{
public:
	Args(int iterations):mutex_(),iterations_(iterations) {}
	ACE_Thread_Mutex mutex_;
	int iterations_;
};

///the starting point for the worker threads
static void* worker(void *arguments)
{
	Args *arg= (Args*) arguments;
	for(int i=0; iiterations_; i++)
	{
		ACE_DEBUG((LM_DEBUG,"(%t) Trying to get a hold of this iteration
")); ///this is our critical section arg->mutex_.acquire(); ///acquire: ACE_DEBUG((LM_DEBUG,"(%t) This is iteration number %d
",i)); ACE_OS::sleep(2); //simulate critical( , ) work arg->mutex_.release(); } return 0; } int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); if(argc<2) { ACE_OS::printf("Usage: %s
",argv[0]); ACE_OS::exit(1); } Args arg(ACE_OS::atoi(argv[2])); //setup the arguments int n_threads= ACE_OS::atoi(argv[1]); ACE_thread_t *threadID=new ACE_thread_t[n_threads+1]; ///DWORD ACE_hthread_t *threadHandles=new ACE_hthread_t[n_threads+1]; ///HANDLE if(ACE_Thread::spawn_n(threadID, ////id's for each of the threads n_threads, ////number of threads to spawn (ACE_THR_FUNC)worker, ///entry point for new thread &arg, ////args to worker THR_JOINABLE | THR_NEW_LWP, //flags ACE_DEFAULT_THREAD_PRIORITY, 0,0,threadHandles)==-1) { ACE_DEBUG((LM_DEBUG,"Error in spawning thread
")); } for(int i=0; i

(9912) Trying to get a hold of this iteration
(9912) This is iteration number 0
(7312) Trying to get a hold of this iteration
(7312) This is iteration number 0
(9912) Trying to get a hold of this iteration
(9912) This is iteration number 1
(7312) Trying to get a hold of this iteration
(9912) Trying to get a hold of this iteration
(7312) This is iteration number 1
(7312) Trying to get a hold of this iteration
(9912) This is iteration number 2
(9912) Trying to get a hold of this iteration
(7312) This is iteration number 2
(7312) Trying to get a hold of this iteration
(7312) This is iteration number 3
(9912) This is iteration number 3
아무 키나 눌러서 계속하세요..

좋은 웹페이지 즐겨찾기