2017-11-28 17 views
0

私はスレッドを実行する必要があるプログラムを持っています。問題は、スレッド内かスレッド外のいずれかからこのスレッドを削除しようとするたびに発生します。 「エラーstd :: threadをkillすることはできません

class myclass 
{ 
public: 
    static myclass* inst() 
    { 
     if (oInst == nullptr) oInst = new myclass; 
     return oInst; 
    }; 
    void main(); 

    void start(); 


    void ex_stop() 
    { 
     //HANDLE Stopper = Killer.native_handle(); 
     //TerminateThread(Stopper, 0); 
    } 
} 
private: 
    std::thread Killer; 

} 

void myclass::start() 
{ 
    Killer = std::thread(&myclass::ex_main, this); 
    Killer.detach(); 
} 

void myclass::main() 
{ 
    ... 
    if (0 == TerminateThread(Killer.native_handle(), 0)) 
    { 
      char error[200]; 


      sprintf(error, "error %i\n", GetLastError()); 

      printf(error); 
    } 

これは私もSTDを作ってみたどのように私は

myclass::inst()->start(); 

クラス/スレッドを開始している::キラーにはexternをスレッドと私の.cppファイルと.hファイルでそれを宣言し、私はクラスの外からアクセスすることができますが、私はまだ同じ "エラー6、無効なスレッドハンドル"エラーが発生します。

このコードの問題点を教えてもらえますか?ありがとう

+2

スレッドを「終了」しないでください。これまでスレッドに共有リソースがロックされていて(おそらく新しいものの中に)、そのスレッドが強制終了された場合、そのリソースは決してロック解除されません。あなたのプログラムはちょうど – UKMonkey

+0

を掛けることを決定するかもしれません。だから、上記のコードを動作させる方法を知っていますか? –

+3

あなたは取り外されていないと考えていますか? VisualC++のstdlib実装でCloseHandleを呼び出します – PeterT

答えて

1

ワーカースレッドを設定する一般的な方法は、ループに入れて、各ループでブール型原子が変更されているかどうかを確認することです。あなたのスレッドは、キュー内の多くのタスクを行いますか、それはそれはやっているワンオフ仕事だ場合であればあなたは言っていませんでした)threadMainはおそらく結合が必要になります

class myThreadJob { 
    public: 

    myThreadJob(): 
    doRun(true), 
    thread(threadMain) 
    {} 

    void threadMain() { 
     while (doRun) {...} 
    } 

    void stop() { 
     doRun = false; 
     thread.join(); 
    } 

    private: 
    std::atomic<bool> doRun; 
    std::thread thread; 
} 

を、しかし;「tはストレートオフコンパイルいずれにしても、長いスレッドであることが予想される場合は、それが実行可能であることを定期的にチェックする必要があります。

スレッドでdetach()を呼び出したので、スレッドはプロセスに関連付けられなくなりました。 detach()は、スレッドが作成スレッドにとってローカルなものを必要としないという宣言と考えることができます。 あなたは参加できません。それが終了するまで実行されることを期待しています。

+0

興味深い、私はそれを試してみましょう。しかし、それは私の主な質問に答えることはできません - 私は無効なハンドル、エラー6を与えている元のコードで間違って何をしています。私はTerminateThreadを使用したい場合でも、私はできるはずですので、コードと私はそれが何であるか知りたいです。 –

+1

http://en.cppreference.com/w/cpp/thread/thread/detach デタッチを呼び出すと、そのスレッドを所有しなくなり、終了できません – UKMonkey

関連する問題