ACE:다중 스레드 소개
6517 단어 ACE
여기 는 우선 좀 간단히 하고, 시간 이 있으면 다시 보충하자
ACE_Thread
간단한 예
포털 함수:
void* worker(const char* arg)
{
ACE_OS::sleep(10);
puts(arg);
return NULL;
}
스레드 생성 및 종료 대기:
ACE_thread_t ThreadID;
ACE_hthread_t Handle;
ACE_Thread::spawn(ACE_THR_FUNC(worker),"Hello,World!",THR_JOINABLE | THR_NEW_LWP,&ThreadID,&Handle);
ACE_Thread::join(Handle);
실행 결과:
간략한 설명:
static int spawn (ACE_THR_FUNC func,
void *arg = 0,
long flags = THR_NEW_LWP | THR_JOINABLE,
ACE_thread_t *t_id = 0,
ACE_hthread_t *t_handle = 0,
long priority = ACE_DEFAULT_THREAD_PRIORITY,
void *stack = 0,
size_t stack_size = ACE_DEFAULT_THREAD_STACKSIZE,
ACE_Thread_Adapter *thread_adapter = 0,
const char** thr_name = 0);
이 인터페이스는 루틴을 만드는 데 사용되며, 매개 변수func는 루틴을 만드는 함수이고,arg는 함수의 실참이며,flags는 기본적으로 t 를 사용합니다.id는 스레드 ID입니다. 이전에 정의할 수 있는 thandle은 라인 핸들입니다. 뒷부분의 인터페이스는 사용할 수 있습니다. 예를 들어 위의 예에서 사용한join
static int join (ACE_hthread_t,
ACE_THR_FUNC_RETURN * = 0);
이 인터페이스는 라인이 끝날 때까지 기다리는 데 사용됩니다. 첫 번째 파라미터는spawn에서 만든 라인 핸들입니다
추가 인터페이스 설명:
static void exit (ACE_THR_FUNC_RETURN status = 0);
종료 스레드 static int setprio (ACE_hthread_t ht_id, int priority, int policy = -1);
스레드 우선 순위 설정static int suspend (ACE_hthread_t);
후크 스레드static int resume (ACE_hthread_t);
복구 스레드
ace\thread를 참조하는 추가 인터페이스도 있습니다.h의 인터페이스 설명
ACE_Thread_Manager
if(-1 == ACE_Thread_Manager::instance()->spawn_n(2,ACE_THR_FUNC(worker),"Hello,World!",THR_NEW_LWP,ACE_DEFAULT_THREAD_PRIORITY,1))
{
ACE_ERROR((LM_ERROR, "Failure to spawn first group of threads: %p
"));
}
ACE_Thread_Manager::instance()->wait_grp(1);
실행 결과:
간략한 설명:
int spawn_n (size_t n,
ACE_THR_FUNC func,
void *arg = 0,
long flags = THR_NEW_LWP | THR_JOINABLE | THR_INHERIT_SCHED,
long priority = ACE_DEFAULT_THREAD_PRIORITY,
int grp_id = -1,
ACE_Task_Base *task = 0,
ACE_hthread_t thread_handles[] = 0,
void *stack[] = 0,
size_t stack_size[] = 0,
const char* thr_name[] = 0);
이 인터페이스는 기본적으로 ACE 와 같은 N 스레드를 할당하는 데 사용됩니다.Thread::spawn, 여기 더 이상 설명 안 할게요.
int wait_grp (int grp_id);
스레드 그룹이 끝날 때까지 기다립니다, 여기grpid는 spawnn의 매개 변수grp_id
ACE_Thread_Manager에서 제공하는 추가 인터페이스는 ace/thread 를 참조하십시오.manager.h의 선언
ACE_Task
간단한 예:
class CAceTask: public ACE_Task
{
public:
int open();
int svc();
int close();
};
int CAceTask::open()
{
// 3
return activate(THR_NEW_LWP,3);
}
int CAceTask::svc()
{
ACE_Message_Block *MsgDate = NULL;
const char *sp = NULL;
do
{
//
timeval tm;
tm.tv_sec = 1;
ACE_Time_Value timeValue(tm);
// put , 1
if(-1 == getq(MsgDate,&timeValue))
{
break;
}
sp = (const char*)MsgDate->rd_ptr();
MsgDate->release(); // Message_Block
cout<
CAceTask t;
t.open();
ACE_Message_Block *MsgDate = NULL;
for(int i = 0; i != 5; ++i)
{
char *sp = new char[6];
strcpy(sp,"wwwww");
MsgDate = new ACE_Message_Block(sp,6);
t.putq(MsgDate);
}
//
ACE_Thread_Manager::instance()->wait();
간단한 설명:
ACE_Task는 이러한 모드를 구현하는 메커니즘을 제공합니다. ACETask 부팅 함수: open, open 허함수 내에서activate 함수를 통해 상응하는 수량의 스레드 탱크를 활성화할 수 있으며, 사용자 코드는 외부에서ACETask 대기열 삽입 요청ACE_Task 클래스의 큐는 ACE 입니다.Message_Queue 대기열, 다른 확장 버전 클래스 ACETask_Ex는 ACEMessage_Queue_Ex 대기열.Open 가상 함수 ACETask 클래스 내부에서 아무것도 하지 않았습니다. ACE의 습관인 오픈 함수로서 기본적으로 모든 클래스의 시작 함수입니다. 사용자 프로그램은 이 함수 내부에서 초기화 작업을 완성할 수 있습니다. 예를 들어activate 시작 루틴을 호출할 수 있습니다.
Activate 함수는 다음과 같이 정의됩니다.
activate(long flags = THR_NEW_LWP | THR_JOINABLE |THR_INHERIT_SCHED ,
int n_threads = 1,
int force_active = 0,
long priority =ACE_DEFAULT_THREAD_PRIORITY,
int grp_id = -1,
ACE_Task_Base *task =0,
ACE_hthread_tthread_handles[] = 0,
void *stack[] = 0,
size_t stack_size[] =0,
ACE_thread_tthread_ids[] = 0); 이 함수 매개 변수는 보기에는 많은 것 같지만 대부분 기본 매개 변수를 사용할 수 있으며 사용자는 호출할 때 activate() 또는 activate(LWP NEW THR, 1)만 호출할 수 있다.여러 스레드를 시작해야 할 경우 activate(LWP NEW THR, 10, 0, ACE DEFAULT THREAD PRIORITY, -1, 0, 0, 0, thread ids), 마지막 매개 변수threadids는 다중 라인에서 유용합니다.
ACE_Task 스레드 실행 함수: svc svc 함수는 진정한 스레드 함수체이고 svc도 허함수입니다. 사용자가 리셋해야 합니다.activate를 통해 여러 스레드를 시작하면 svc 함수에서 ACEThread_::self()==thread_ids[i]를 비교하여 해당하는 사용자 처리 함수를 시작합니다.예를 들면 다음과 같습니다.
#define THREADS 2
class Task_Test : public ACE_Task
{
public:
~Task_Test();
int open(void*);
int svc(void);
int close(u_long);
private:
void handle_thread_1(u_long);
void handle_thread_2(u_long);
private:
ACE_thread_t thread_ids[THREADS];
};
Task_Test::~Task_Test()
{
wait(); //
}
int Task_Test::open(void*)
{
activate(THR_NEW_LWP,
THREADS,
0,
ACE_DEFAULT_THREAD_PRIORITY,
-1,
0,
0,
0,
0,
thread_ids);
return 0;
}
int Task_Test::svc(void)
{
for (int i = 0; i < THREADS; i++) {
if (ACE_Thread::self() == thread_ids[i])
switch (i) {
case 0:
handle_thread_1(thread_ids[i]);
break;
case 1:
handle_thread_2(thread_ids[i]);
break;
default:
break;
}
}
return 0;
}
int Task_Test::close(u_long code)
{
printf("thread exit:%d
", code);
return 0;
}
void Task_Test::handle_thread_1(u_long code)
{
printf("this is thread:%d
", code);
}
void Task_Test::handle_thread_2(u_long code)
{
printf("this is thread:%d
", code);
}
int main(int argv, char * argc[])
{
Task_Test task;
task.open(0);
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.