ACE 스레드의 ACEThread_Mutex 배제 잠금 장치
3051 단어 ACE
임계 구역에 들어가기 전에 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
아무 키나 눌러서 계속하세요..
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
ACE 스레드의 ACEThread_Mutex 배제 잠금 장치상호 배척체는 상호 배척(mutual exclusion) 동기화의 간단한 형식을 실현했다.상호 배척체는 여러 라인이 보호된 코드 임계 구역 (critical section) 에 동시에 들어가는 것을 금지합니다.따라서...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.