【发布时间】: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