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