gpt4 book ai didi

关闭 C 应用程序以确保关键部分完成的正确方法?

转载 作者:行者123 更新时间:2023-11-30 14:27:20 27 4
gpt4 key购买 nike

我在单线程 C 应用程序中定义了一个关闭钩子(Hook)处理程序。

int main(int argc, char * argv[]){
//Shutdown hook for CTRL-C
(void) signal(SIGINT, shutdownHook);
...
...
}

因此,当用户按下 CTRL-C 时,关闭 Hook 就会启动...

void shutdownHook(int sig){
rc = wmq_sender_stop(errorStr);
if (rc != 0){
printf("\n%s\n", errorStr);
}
while(transactionRunning == TRUE){
sleep(1);
printf("Transaction still running\n");
}
....
....
}

您可以在上面看到,我调用了一个“wmq_sender_stop”例程(在共享库中),该例程实质上将变量设置为 FALSE 以结束该共享库中的循环。

int wmq_sender_stop(char errorStr[ERROR_STR_LEN]){
running = FALSE;
...
}

并且该变量“running”将停止(希望)在该共享库中运行的主循环。

while(running == TRUE){
...
...
}

我遇到的问题是在我的 Linux 机器上一切正常 100%...但是当我在强大的大型服务器上安装应用程序时,它会调用“wmq_sender_stop”并设置变量,但应用程序似乎是在服务器上运行得太快,不允许“while(running == TRUE)”变量退出.....或者它只是返回主应用程序太快,而“while(transactionRunning == TRUE)”循环只是连续运行...

基本上在大型服务器上,如果我点击 CRTL-C,以下内容会连续输出到屏幕上:

Transaction still running
Transaction still running
Transaction still running
Transaction still running
Transaction still running
Transaction still running
...

也许我需要在这里创建线程并在它们之间进行相互通信,但是即使在极快的服务器上,它们是否没有更简单的方法来优雅地允许“共享库中的循环”在关闭之前结束它的“关键代码/事务”?为什么它可以在我的 Linux 笔记本电脑上运行?

如果我需要使用线程,它们进行通信的最佳和最快的方式是什么?目前我正在使用回调......但不确定线程​​的最佳 IPC 是什么?

感谢您的帮助,非常感谢

林顿

最佳答案

确保running(以及transactionRunning)被声明为 volatile 。否则,C 编译器在某些情况下可能会缓存其值。现在,将 volatile 视为“该值可以通过信号处理程序更改”。

请注意,您必须小心使用如下代码:

rc = wmq_sender_stop(errorStr);

如果您在信号处理程序中执行此操作,您最好希望该函数可以安全地从信号处理程序调用。大多数功能都不是。 (即使从多个线程调用是安全的函数,从信号处理程序调用也是不安全的。)

最后一个问题是,如果您的代码是单线程的,但您从未从信号处理程序中返回,那么您的主循环应该如何退出?信号处理程序在应用程序的现有线程之一中运行。通常,您在信号处理程序中唯一想要做的就是更改标记为 volatile 的全局变量的值,然后返回。

关于关闭 C 应用程序以确保关键部分完成的正确方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7963336/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com