使用pthread实现,但不能使用std :: thread:阻塞我的mainloop函数的线程

时间:2013-11-02 14:42:01

标签: multithreading c++11

昨天我试过正确使用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并阻止主循环。

有谁知道线程为什么阻止我的主循环?我怎么能避免这个问题?

0 个答案:

没有答案