它被杀死后如何处理std :: thread?

时间:2018-02-15 17:15:19

标签: c++ multithreading signals stdthread sigterm

假设我们有一个线程程序。我们创建了一些资源(即互斥体),产生了自己初始化的线程,等待它们完成,然后破坏资源。

var x = document.getElementByClassName("playButton medium");
for (var i=0; i < x.length; i++) {
  x[i].onclick = function() {
    alert("clicked");
  }
};

现在假设其中一个线程遗憾地在work_with_resources()期间收到了SIGTERM。这意味着线程的本地资源永远不会被销毁。

问题1:如何跟踪资源?是否有可能销毁被杀死的线程的本地资源?

问题2:被杀后的线程是否仍然可以加入? join()方法会立即返回吗?加入()和被杀死的线程是一个好习惯吗?

问题3:由于被杀死的线程可能使用了全局资源,因此它可能处于无效状态。有没有办法阻止所有其他线程使用全局资源来防止进一步的损坏?

C ++线程库是否与信号协同工作?

1 个答案:

答案 0 :(得分:2)

首先,SIGTERM对不同版本的POSIX库表现不同。在2.6 SIGTERM将强制线程干净地退出。但是对于2.4,线程将处于不确定状态。

现在你的第一个问题: -

  

问题1:如何跟踪资源?是否有可能销毁被杀死的线程的本地资源?

在这种情况下,您无法跟踪资源,也无法再访问该主题。

现在你的第二个问题: -

  

问题2:被杀后的线程是否仍然可以加入? join()方法会立即返回吗?加入()和被杀死的线程是一个好习惯吗?

根本不是你的所有问题。

现在你的第三个问题: -

  

问题3:由于被杀死的线程可能使用了全局资源,因此它可能处于无效状态。有没有办法阻止所有其他线程使用全局资源来防止进一步的损坏?

在这种情况下,您可以使用pthread条件变量(pthread_cond_t)。