2012-03-12 28 views
4

私はC++優先キューC++

ThreadInfoにクラスが

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; 
    } 
}; 

その後、私は要素を挿入で比較

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

あなたは*ロット*のコードを投稿しました。*ほとんどの*は関係ありません。 –

答えて

3

同じメモリチャンクへのポインタをキューに渡しています。ローカルオブジェクトへの参照を持つregister_threadを呼び出し、そのアドレスをキューに入れます。それが彼らがすべて同じ理由です。もう1つの問題は、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)が終了すると、ローカル変数はもう存在せず、ポインタは割り当てられていないメモリを指しています。

がありこれには2つのソリューションです:

  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

はい、私は問題を理解しました。同じデータが各プッシュコールで上書きされます。したがって、同じスレッド情報オブジェクトは複数回プッシュされます。 –

関連する問題