0

昨日 std::thread を正しく使用しようとしましたが、非常に暗いです。

pthread を使用した私のプログラムの実装はうまく機能します。問題はありません。std::thread で同じ解決策を取りたいと思います(可能であれば)。

pthread を使用したソリューション:

void *MyShell(void *data) {
  std::string str;

  while(1) {
    std::cin >> str;

    std::cout << str << std::endl;

  }
}

void mainloop() {
  pthread_t thread;
  pthread_create(&thread, NULL, aed::map::shell::Shell, this);
  ...
  pthread_cancel(thread);
}

そして今、std::thread を使用して、毎回機能しないソリューション:

class ShellThreadInterrupFlag {
  public:

    void interrupt() {
      throw std::string("Thread interruption test\n");
    }

};

class ShellThread {
  public:

    template<typename FunctionType, typename ParamsType> 
    ShellThread(FunctionType f, ParamsType params) {

      std::promise<ShellThreadInterrupFlag *> p[3];
      _internal_thread = new std::thread(f, p, params);
      _flag = p[0].get_future().get();
      _internal_thread->detach();
      p[1].set_value(_flag); // tell the thread that we detached it
      p[2].get_future().get(); // wait until the thread validates the constructor could end (else p[3] is freed)
    }

    ~ShellThread() {
      delete _internal_thread;
    }

    void interrupt() {
      _flag->interrupt();
    }

  private:

    std::thread *_internal_thread;
    ShellThreadInterrupFlag *_flag;
};

void Shell(std::promise<ShellThreadInterrupFlag *> promises[3],
           aed::map::MapEditor *me)
{
  ShellThreadInterrupFlag flag;

  promises[0].set_value(&flag); // give the ShellThread instance the flag adress 

  promises[1].get_future().get(); // wait for detaching
  promises[2].set_value(&flag);   // tell ShellThread() it is able to finish

  while(1) {
    std::cin >> str;

    std::cout << str << std::endl;
  }
}

void mainloop()
{
  ShellThread *shell_thread;

  shell_thread = new ShellThread(Shell, this);

  ... // mainloop with opengl for drawing, events gestion etc...

  shell_thread->interrupt();
}

プログラムを起動すると、std::cin >> strが呼び出されてメインループがブロックされることがあります。

スレッドがメインループをブロックしている理由を知っている人はいますか? そして、どうすればこの問題を回避できますか?

4

0 に答える 0