【问题标题】:pthread_cancel() alternatives in Android NDK?Android NDK 中的 pthread_cancel() 替代方案?
【发布时间】:2011-06-04 08:24:06
【问题描述】:

我正在将中型 C++ 代码体移植到 Android NDK。不幸的是,pthreads 实现(从 NDK v5 开始,无论如何)是不完整的。具体来说,我们的应用程序依赖 pthread_cancel() 来终止工作线程。 NDK 没有实现 pthread_cancel()!当工作线程正常响应时,还有其他明显的答案。但是在工作线程没有响应的情况下(例如无限循环),我怎样才能在不杀死整个进程的情况下取消它?

【问题讨论】:

    标签: c++ pthreads android-ndk


    【解决方案1】:

    我创建了一个小型库来处理这个问题。

    它利用了仿生线程结构中一些未使用的部分。

    我叫它libbthread :)

    享受;)

    【讨论】:

      【解决方案2】:

      适合此人的可能选项:http://igourd.blogspot.com/2009/05/work-around-on-pthreadcancel-for.html

      在此转发以防万一:

      然后我使用 pthread_kill 来触发一个 SIG_USR1 信号和使用信号处理程序 退出这个 pthread 并尝试它,它 有效,但仍然想知道是否有 这种方法的缺点。

      超时:

      if ( (status = pthread_kill(pthread_id, SIGUSR1)) != 0) 
      { 
          printf("Error cancelling thread %d, error = %d (%s)", pthread_id, status, strerror status));
      } 
      

      USR1 处理程序:

      struct sigaction actions;
      memset(&actions, 0, sizeof(actions)); 
      sigemptyset(&actions.sa_mask);
      actions.sa_flags = 0; 
      actions.sa_handler = thread_exit_handler;
      rc = sigaction(SIGUSR1,&actions,NULL);
      void thread_exit_handler(int sig)
      { 
          printf("this signal is %d \n", sig);
          pthread_exit(0);
      }
      

      看起来最好的答案是重写,这样线程就不会在 IO 上等待:http://groups.google.com/group/android-platform/browse_thread/thread/0aad393da2da65b1

      【讨论】:

      • 工作线程在等待时会在信号量上等待外部事件,因此这是添加线程取消检查的明显位置。有一些有限的阻塞 I/O,但这不是线程变得无响应的预期原因。我希望避免使用信号来关闭线程,因为这需要在每个线程(IME)中破解 sigmask。
      • 是的,遗憾的是当前的 Android NDK 中没有,增加了一些烦人的任务。多平台开发的乐趣。我们非常轻松地移植了我们的线程库,因为我们不必使用 pthread_cancel 或信号量,但看起来某种重写/接口实现将由于缺少而必须更改。
      • 在信号处理程序中调用pthread_exit() 基本上就是异步取消的作用(参见pthread_setcanceltype())。这是危险的,很难正确使用。延迟取消更容易正确使用,因为它只在特定的取消点取消(尽管仍然需要相当大的努力),但对于线程库来说也更难实现。
      • 这个建议基本上是我实现的。我确实希望有一个更好的解决方案,因为信号处理很难正确实现。但这行得通,而且是便携的。
      • 在设计 pthread_cancel() 时考虑了取消信号。 pthread_cancel() 的手册页描述了他们选择背后的原因:“考虑了两个替代函数来向线程发送取消通知。一个是定义一个新的 SIGCANCEL 信号,该信号在传递时具有取消语义;另一个是定义新的 pthread_cancel() 函数,它将触发取消语义。”有关他们选择的原因的更多详细信息,请参阅手册页。
      猜你喜欢
      • 2015-06-13
      • 2016-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-03
      相关资源
      最近更新 更多