1. ホーム
  2. スクリプト・コラム
  3. その他

[解決済み] アクティブな例外なしで呼び出されたC++の終了

2022-01-12 06:32:09

質問

コードは次のとおりです。

#include <queue>
#include <thread>
#include <mutex>
#include <condition_variable>

template<typename TYPE>
class blocking_stream
{
public:
    blocking_stream(size_t max_buffer_size_)
        :   max_buffer_size(max_buffer_size_)   
    {
    }

    //PUSH data into the buffer
    blocking_stream &operator<<(TYPE &other)
    {
        std::unique_lock<std::mutex> mtx_lock(mtx); 
        while(buffer.size()>=max_buffer_size)
            stop_if_full.wait(mtx_lock);

        buffer.push(std::move(other));

        mtx_lock.unlock();
        stop_if_empty.notify_one();
        return *this;
    }
    //POP data out of the buffer 
    blocking_stream &operator>>(TYPE &other)
    {
        std::unique_lock<std::mutex> mtx_lock(mtx);
        while(buffer.empty())
            stop_if_empty.wait(mtx_lock);

        other.swap(buffer.front()); 
        buffer.pop();

        mtx_lock.unlock();
        stop_if_full.notify_one();
        return *this;
    }

private:
    size_t max_buffer_size;
    std::queue<TYPE> buffer;
    std::mutex mtx;
    std::condition_variable stop_if_empty,
                            stop_if_full;
    bool eof;   
};

実行すると、エラーが発生します。

terminate called without an active exception Aborted

この例を参考に、コードをモデル化しました。 http://www.justsoftwaresolutions.co.uk/threading/implementing-a-thread-safe-queue-using-condition-variables.html

解決方法は?

スレッドオブジェクトがスコープ外に出たとき、それが参加可能な状態であれば、プログラムは終了します。標準委員会は、結合可能なスレッドのデストラクタについて、他に2つの選択肢を持っていました。静かにjoinする -- しかし、スレッドが動かなくなった場合、joinは決して戻らないかもしれない。あるいは、スレッドをデタッチすることもできます(デタッチされたスレッドは参加可能ではありません)。しかし、デタッチド・スレッドは非常にやっかいで、プログラムの最後まで生き残り、リソースの解放を台無しにするかもしれないからだ。ですから、プログラムを終了させたくない場合は、必ずすべてのスレッドに参加(またはデタッチ)するようにしてください。