私は、Javaのスレッドを模倣するpthread/windowsネイティブスレッドのラッパーを作成しました。
class Thread{
public:
virtual void run()=0;
void start();
void join();
virtual ~Thread(){
join();
}
};
仮定する
class B:public Thread{
int x;
void run(){
while some condition do soemething on x;
}
};
run()が戻る前にBのインスタンスが破棄された場合、スレッドはxにアクセスし続けますが、これは明らかに望ましくありません。問題を解決するには、追加する必要があります
B::~B(){
join();
}
B ::xが破棄された後にThread::〜Thread()が呼び出されるため、joinは効果がありません。
ただし、クラスC:public Bに追加のデータがある場合でも、C ::〜C(){join();}を定義する必要があります。
など、すべての階層
別の方法は
template<typename R>
struct SafeThread:public R,public Thread{
void run(){
R::run();
}
};
スレッドが参加した後にRデータ(以前のB :: x)が破棄されるようにします。しかし、それでも
class B{
virtual void f(){...}
void run(){ f();}
};
class C:public SafeThread<B>{
int y;
void f(){
...something on y;
}
};
まだ同様の問題があります。すべてのサブクラスSCにSC::〜SC(){join();}を定義させることなく、runメソッドの終了後にデータが確実に破棄されるという問題を解決するための洗練されたソリューションがあると思いますか?