【问题标题】:Exiting the p-thread cleanly using sigint as Interrupt使用 sigint 作为中断干净地退出 p 线程
【发布时间】:2021-09-01 08:26:33
【问题描述】:

我目前正在研究树莓派并将 ADC 与它连接。 ADC 连续输出数字值。值的读取及其处理是在线程中启动和执行的,因此它应该永远运行。但是,为了干净地退出线程(出于某种原因),我想使用 SIGINT 信号处理程序,它会触发中断并更改 volatile 变量的状态。 伪程序如下:

volatile sig_atomic_t exitThread = 0;

void signalHandler(){
    exitThread = 1;
}

void SPI_Port0(){
    //initialisation of functions and variables
    
    while(!exitThread){
         //do the work
    }

    if(exitThread){
         pthread_exit(NULL);
    }
}

void main(){

     struct sigaction sa;
     memset(&sa, 0, sizeof(sa));
     sigemptyset(&sa.sa_mask);
     sa.sa_handler = signalHandler;
     
     sigaction(SIGINT, &sa, NULL);

     pthread_t SPI0,SPI3;
     pthread_create(&SPI0, NULL, SPI_Port0, NULL);
     pthread_create(&SPI3, NULL, SPI_Port1, NULL);

     pthread_join(SPI0, NULL);
     pthread_join(SPI3, NULL);

   //printing the results stored in arrays
   //the arrays is declared global
 }

有两个线程 SPI_Port0 和 SPI_Port1 执行相同的实现但在两个不同的 SPI 端口上,我希望这两个线程在按下 CTRL + C 时退出。我面临的问题是,整个程序都退出了。

谁能指出我正确的方向。任何帮助将不胜感激。

【问题讨论】:

  • 这两个线程是唯一运行的线程吗?如果它们是,并且它们都在 CTRL-C 上退出,那么整个程序将退出,因为两个 pthread_join() 调用都将返回并且主线程将继续。您发布的内容是否完整?还有其他线程吗?
  • 这可能不是你的直接问题,但if (exitThread) { pthread_exit } 块是不必要的——从线程过程返回相当于调用 pthread_exit。
  • 这可能不是你的直接问题要么,但你的线程过程有错误的函数签名——它们应该被声明为例如void *SPI_Port0(void *unused),它们应该以 return 0; 结尾。
  • @AndrewHenle 实际上是的。在我按下 ctrl + c 后,线程应该退出并且处理应该转移到主函数。在 join_thread 调用之后,我实际上想打印已处理的数据值,这些值已存储在数组中(全局声明)。但是只要我按下 ctrl + c,整个程序就会退出。
  • @zwol 感谢您指出那件事。实际上,我浏览了很多关于如何声明线程函数的帖子,我在其中一个上看到了这个。我会改正的。

标签: c linux multithreading signals raspberry-pi4


【解决方案1】:

变量和全局变量的修改不会与子线程共享,因为它们是其他进程。

首先你必须捕捉到信号: Catch Ctrl-C in C

那么,在信号中断中,子线程必须被杀死:For pthread, How to kill child thread from the main thread

【讨论】:

  • 变量和全局变量不与子线程共享,因为它们是其他进程。什么?!?!?
  • 全局变量在线程之间共享。请通过此链接一次:geeksforgeeks.org/multithreading-c-2/….
  • @KaustubhBhargava 全局变量在所有线程之间共享,但 geeksforgeeks.org 不是可靠的参考,请不要指向它。我在您链接到的页面上看到许多错误。
猜你喜欢
  • 1970-01-01
  • 2014-03-29
  • 1970-01-01
  • 2012-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-10
  • 2014-07-24
相关资源
最近更新 更多