2012-03-12 5 views
4

나는 ThreadInfo에 클래스가우선 순위 대기열 C++

class ThreadInfo { 
public: 
    ThreadInfo(); 
    ThreadInfo(const ThreadInfo& orig); 
    ThreadInfo(int thread_id,int init_time,int sleep_time,int run_time,int priority,int is_critical) 
    { 
     this->thread_id=thread_id; 
     this->is_critical=is_critical; 
     this->init_time=init_time; 
     this->priority=priority; 
     this->run_time=run_time; 
     this->sleep_time=sleep_time; 
    } 

    void set_critical(bool value) 
    { 
     is_critical=value; 
    } 
    bool get_critical() 
    { 
     return is_critical; 
    } 
    void set_sleep_time(long value) 
    { 
     sleep_time=value; 
    } 

    long get_sleep_time(long value) 
    { 
     return sleep_time; 
    } 

    void set_run_time(long value) 
    { 
     sleep_time=value; 
    } 

    long get_run_time(long value) 
    { 
     return sleep_time; 
    } 
    int get_lock_type() 
    { 
     return lock_type; 
    } 
    void set_lock_type(int lock_type) 
    { 
     this->lock_type=lock_type; 
    } 

    int get_priority() 
    { 
     return priority; 
    } 
    void set_priority(int value) 
    { 
     this->priority=value; 
    } 

    unsigned long int get_thread_id() 
    { 
     return thread_id; 
    } 
    void set_thread_id(unsigned long int value) 
    { 
     this->thread_id=value; 
    } 
    virtual ~ThreadInfo(); 

private: 
    unsigned long int thread_id; 
    long init_time; 
    long sleep_time; 
    long run_time; 
    int priority; 
    bool is_critical; 
    //1=spin,2=busy,3=semaphore 
    int lock_type; 



}; 

이며, 클래스

class CompareThread { 
public: 
    bool operator()(ThreadInfo* th1, ThreadInfo* th2) 
    { 
     if (th1->get_priority()>th2->get_priority()) return true; 

     return false; 
    } 
}; 

다음 난에 요소를 삽입입니다 비교 C에서 다음 우선 순위 큐 ++

priority_queue < ThreadInfo*, vector<ThreadInfo*>, CompareThread > thread_queue; 

을 생성 다음 기능,

나는 다음과 같은 함수의 스레드 레지스터를 호출

,

int ThreadController::thread_register(pthread_t &t, int priority, bool critical) 
{ 
    ThreadInfo ti; 
    cout<<"t reg:"<<t<<endl; 
    ti.set_thread_id(t); 
    ti.set_critical(critical); 
    ti.set_priority(priority); 
    ThreadScheduler::Instance()->register_thread(ti); 
} 

하지만 난이 thread_queue.top를 (호출 할 때 내가 가장 최근의 객체를 가져 큐에 ThreadInfo 객체 일부를 누를 때마다), 여부 우선 순위가 가장 낮은 스레드 객체를 반환해야합니다. 여기에 문제가 있습니까?

+2

으로가는 것이 좋습니다? –

+0

안녕하세요, 코드를 업데이트했습니다. 여기에 요소를 어떻게 밀어 넣었는지 알 수 있습니다. @ JoachimPileborg –

+0

코드의 * lot *을 게시했습니다. * 대부분의 *는 관련이 없습니다. –

답변

3

동일한 메모리 청크에 대한 포인터를 대기열로 전달하고 있습니다. register_thread를 로컬 객체에 대한 참조와 함께 호출하고 주소를 대기열에 넣습니다. 그것이 모두 같은 이유입니다. 또 다른 문제는 thread_register 함수를 그대로두면 로컬 ti이 삭제되고 (범위를 벗어남) 큐에 유효한 항목이없는 것입니다.

각 정보에 대해 새 메모리를 할당하고이 메모리에 데이터를 복사해야합니다. 따라서, 각 요소는 당신이 복사 생성자가있는 경우이 할 것, 큐가 다른 new에서 온이 삽입 포인터 :

void ThreadScheduler::register_thread(ThreadInfo &th) 
{ 
     thread_queue.push(new ThreadInfo(th)); 
     /* ... */ 
} 

확인이 : https://stackoverflow.com/a/986093/390913

+0

죄송합니다. 이해가 안됩니다. "큐에 같은 메모리 덩어리에 대한 포인터를 전달하는 것처럼 들립니다"라고 자세히 설명 할 수 있습니까? –

+0

안녕하세요, 코드를 업데이트했습니다. –

+0

큐에서 터져 나오고 가져온 요소를 검사하여이를 확인할 수 있습니다. –

1

문제는 당신에게이 있다는 것입니다 함수에서 국지적으로 선언 된 변수에 대한 포인터를 사용합니다. 함수 (ThreadController::thread_register)가 완료되면 로컬 변수는 더 이상 존재하지 않으며 포인터는 할당되지 않은 메모리를 가리키고 있습니다.

가이 두 솔루션은 다음과 같습니다

  1. 를 사용하여 스마트 포인터, std::shared_ptr 등이 있으며, ThreadController::thread_register에 새 포인터를 만들 : 당신이 std::shared_ptr로 변경 기억해야 물론

    std::shared_ptr<ThreadInfo> ti(new ThreadInfo); 
    

    다른 곳에서도 . 대신 -> 액세스 연산자를 사용하십시오.

  2. 포인터를 전혀 사용하지 않고 클래스 데이터 (최소한의 단순함)를 복사 할 수 있습니다.

난 당신이 대기열에 항목을 넣어 코드를 표시 할 수 있습니다 대안 2.

+0

처음에는 큐 전용 스레드 객체에서 포인터를 사용하지 않았습니다. 그런 다음 큐 내용을 인쇄하려고 할 때 쓰레기 값을주었습니다. 이제 내부 비교가 작동하지 않는 것은 괜찮습니다. –

+0

@Pbasak 저를 신뢰하십시오. 지역 변수에 대한 포인터를 사용하면 조만간 당신의 얼굴에 (비 유적으로 말하면) 프로그램이 날아갈 것입니다. 내 생각 엔 순수한 운에 의해'ThreadController :: thread_register'를 호출 할 때마다 구조체가 똑같은 메모리 영역을 차지하게되어 이전 데이터를 "덮어 쓸"것입니다. –

+0

예, 제가 문제를 알아 냈습니다. 동일한 푸시 콜에서 동일한 데이터가 덮어 씁니다. 그래서 동일한 스레드 정보 객체가 여러 번 푸시됩니다. –