2

マルチスレッド、マルチキューのC++プログラムを終了する際に問題が発生します。この図は、キューとスレッドの構造を示しています。図はここにあります:http://i.stack.imgur.com/JGhXs.png

つまり、3つのスレッドと2つの並行キューがあります。second_handler(second_thread)は、最初のキューからポップし、2番目のキューにプッシュします。キーボードのキーを押してプログラムを終了するまでは、すべて(と思われる)正常に動作します。このエラーが発生します:

'boost :: exception_detail :: clone_impl>' what():boost::lock_errorのインスタンスをスローした後に呼び出された終了

これが私のコードです: main

int main() {
        startMultiThreading();
        cout <<"I"<<endl;
    }

startMultiThreading

void startMultiThreading() {
    boost::thread_group someVar_workers;
    boost::thread_group someOtherVar_workers;

    concurrent_queue<someVar* > someVar_queue(&someVar_workers);
    concurrent_queue<someOtherVar*> someOtherVar_queue(&someOtherVar_workers);

    boost::thread *first_thread = new boost::thread(first_handler, &someVar_queue);
    boost::thread *second_thread = new boost::thread(second_handler, &someVar_queue, &someOtherVar_queue);
    boost::thread *third_thread = new boost::thread(third_handler, &someOtherVar_queue);

    someVar_workers.add_thread(first_thread);
    someVar_workers.add_thread(second_thread);

    someOtherVar_workers.add_thread(second_thread);
    someOtherVar_workers.add_thread(third_thread);

    while (true) {
        if (thread_should_exit) {
            cout << "threads should be killed" << endl;
            while (!someVar_queue.empty()) {
                usleep(1000);
            }
            someVar_workers.remove_thread(second_thread);
            while (!someOtherVar_queue.empty()) {
                usleep(1000);
            }
            someOtherVar_queue.cancel();
            someVar_workers.join_all();
            someOtherVar_workers.remove_thread(second_thread);
            someOtherVar_workers.join_all();
            break;
        }
        usleep(10000);
    }
    cout << "H" << endl;
}

私が欲しいのは、両方のキューを終了してから正常に終了するプログラムです。私が期待するのは、プログラムが終了する前に「I」が印刷されるのを見ることです。出力は次のとおりです。

    End of first_handler
    threads should be 
    second_handler is canceled
    End of second_handler
    H
terminate called after throwing an instance of 'concurrent_queue<someOtherVar*>::Canceled'
Aborted
    Press [Enter] to close the terminal ...

スレッドとキューを閉じるときに何が間違っていますか?

ありがとうございました

4

1 に答える 1

2

まず、KillianDS からのコメントを参照してください。例が長すぎます。

もう1つは、デストラクタを直接呼び出さないでください!!

デストラクタは特別なものであり、変数のスコープの最後でそれを呼び出すことが言語によって保証されています。手動で呼び出すと、2 回目に呼び出され、未定義の動作につながる可能性が高くなります。

デストラクタを手動で呼び出す

于 2012-05-09T09:16:07.553 に答える