【问题标题】:How to kill remaining threads when we come out of any single one? [duplicate]当我们从任何一个线程中出来时,如何杀死剩余的线程? [复制]
【发布时间】:2015-01-20 09:41:53
【问题描述】:
#include <pthread.h>
#include <stdio.h>

#include <stdlib.h>
#define NUM_THREADS     5


void *PrintHello(void *threadid)
{
    long tid;
    tid = (long)threadid;
    printf("Hello World! It's me, thread #%ld!\n", tid);
    pthread_exit(NULL);
}

int main (int argc, char *argv[])//main
{

    int rc;
    long t;
    for(t=0; t<NUM_THREADS; t++){
        pthread_mutex_lock(&lock);
        printf("In main: creating thread %ld\n", t);
        rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t);//creating thread

        if (rc){
            printf("ERROR; return code from pthread_create() is %d\n", rc);
            exit(-1);
        }
    }

    /* Last thing that main() should do */
    pthread_exit(NULL);

}

释放线程时如何杀死剩余的所有线程

【问题讨论】:

标签: c multithreading pthreads


【解决方案1】:

杀死另一个线程是糟糕的设计。标准设计是使用一个变量来指示线程它应该完成。每个线程都应在代码中的适当位置检查变量并相应地退出。

原因是只有线程知道什么时候是退出的好时机,然后它可以自己清理。

【讨论】:

  • 我想那样不会打扰它的好坏!
  • @user1208381:您的问题的答案在这里:“...使用变量向线程指示它应该完成。
【解决方案2】:

实施两锁解决方案。 伪代码:

void *PrintHello() {
  wait_for(lock1);
  if( test_and_set(lock2) == true) {
     release_others();
     /* Do my stuffstuff... */
  } else {
    /* I'm not first. Exit. */
    pthread_exit(null);
  }
}

【讨论】:

  • i_own() 是预定义的?
  • @user1208381 我脑子里没有正确的 C 序列,所以你需要在 C 中找到正确的语法。我已经更新了伪代码。
【解决方案3】:

如果您不担心代码设计不当,我建议您尝试pthread_cancel(thread[t]) 取消所需的线程。 (参考http://man7.org/linux/man-pages/man3/pthread_cancel.3.html)。我认为这是一种安全的方法。确保设置线程的取消状态。

还有另一种方法可以使用pthread_kill(thread[t],SIGKILL) 发出信号(请参阅:http://man7.org/linux/man-pages/man3/pthread_kill.3.html)。这个信号SIGKILL 会杀死你的整个进程。如果您想杀死选择性线程(参考-https://en.wikipedia.org/wiki/Unix_signal#POSIX_signals),您还可以引发其他信号而不是SIGKILL,在这种情况下,您必须在线程中使用信号处理程序(参考-[sigaction][1] 或@987654329 @) 来处理你试图提出的信号并适当地处理它。但请注意,此方法相当复杂,因为您必须阻止您不想杀死的线程中的信号。

【讨论】:

  • 好的,我们如何使用信号杀死所有线程?
  • @user1208381:你不能,至少不能直接。线程可能会收到信号,然后线程的信号处理程序可能会启动线程的结束。
  • 你浏览过unix信号的链接吗?你看到 SIGKILL 做了什么吗?
  • @alk SIGKILL 是一个例外。它不能被抓住或忽视。它会直接杀死进程
  • 你能用代码解释一下吗@vikram
猜你喜欢
  • 2010-12-13
  • 1970-01-01
  • 2011-06-28
  • 1970-01-01
  • 1970-01-01
  • 2011-05-30
  • 2021-12-06
  • 2013-04-18
  • 1970-01-01
相关资源
最近更新 更多