如何暂停和恢复线程?

时间:2019-02-15 16:13:38

标签: c linux

我正在尝试编写程序,该程序将停止并继续执行线程而不是取消它。我需要知道,我该如何实现?

我想对SIGSTOP和SIGCONT信号使用pthread_kill()函数。

#include <pthread.h>
#include <signal.h>
#include <stdio.h>
#include <time.h>



void *threadfunc(){
        while(1){
            printf("i am thread \n");
            sleep(1);
        }
}

void main(){
    pthread_t thread;
    pthread_create(&thread, NULL, threadfunc, NULL);
    sleep(2);
    pthread_kill(thread, SIGSTOP);
    printf("signal sent \n");
    sleep(2);
    printf("i am main thread \n");
}

我的期望:  程序启动,打印2次“我是线程”,pthread_kill发送停止线程的信号,用户看到“信号发送”和“我是主线程”。 实际结果:  程序启动,打印两次“我是线程”,pthread_kill发送停止信号并终止程序

2 个答案:

答案 0 :(得分:4)

没有正确的方法来暂停和恢复线程。

首先,没有线程正在运行的代码的配合,根本无法做到这一点。否则,如果在线程持有要恢复的线程需要先获取的锁之前暂停它,则可能会发生灾难。因此,必须与您要暂停的线程正在运行的代码配合使用。

在线程的配合下,您可以随意进行操作。您可以拥有一个线程定期检查的原子布尔。如果设计为在无事可做时暂停,线程就不能任其执行。

没有正确的方法,它完全取决于其他设计决策。主要取决于代码在做什么以及为什么要暂停它。

另外一件非常重要的事情:每当您感到需要从外部进入线程并使其执行或不执行某项操作时,这应该向您发出信号,说明您首先将线程编码为错误。线程应根据自己的设计知道需要执行的工作以及何时不需要执行的工作。如果有其他事情需要侵入性地“介入”并使它做或不做某事,则应重新检查使您达到这一点的设计决策。

至您的特定观点:

  

我想对SIGSTOP和SIGCONT信号使用pthread_kill()函数。

那可能行不通。如果线程碰巧持有需要从pthread_kill返回的内部库锁,该怎么办?试图暂停的线程也将自行暂停。无论如何,SIGSTOP被定义为停止进程,而不是线程。

答案 1 :(得分:0)

您不能在线程上使用 SIGSTOP/SIGCONT 信号,因为它们有几个主要问题:

  • 它们实际上是由进程处理的,而不是由线程处理的。即使发送到 线程。
  • 他们不会排队。如果您发送它们的速度比处理程序接收它们的速度快,则只会处理第一个。因此,您可以暂停线程、释放取消暂停信号并因此而保持死锁。

幸运的是有“实时信号”,可用于模拟您正在寻找的 STOP/CONT 行为。在此处查看我的建议:https://stackoverflow.com/a/68119116/10277365