在C程序中长时间运行的while循环中防止软锁定/无响应的正确方法是什么?
(dmesg 报告软锁定)
伪代码是这样的:
while( worktodo ) {
worktodo = doWork();
}
我的代码当然要复杂得多,并且还包括一个 printf 语句,该语句每秒执行一次以报告进度,但问题是,此时程序停止响应 ctrl+c。
我尝试过的有效方法(但我想要一个替代方案):
- 每次循环迭代都执行 printf(不知道为什么,但是程序会再次以这种方式响应(???)) - 由于不需要 printf 调用而浪费了大量性能(每个 doWork() 调用不会花费很长时间)
- 使用 sleep/usleep/... - 对我来说似乎也是浪费(处理)时间,因为整个程序已经全速运行了几个小时
我正在考虑的是某种 process_waiting_events() 函数等,正常信号似乎工作正常,因为我可以在不同的 shell 上使用 kill 来停止程序。
附加背景信息:我正在使用GWAN,我的代码在 main.c“维护脚本”中运行,据我所知,它似乎在主线程中运行。
非常感谢。
PS:是的,我确实检查了我发现的有关软锁定的所有其他线程,但它们似乎都在询问为什么会发生软锁定,而我知道原因并希望有一种方法来防止它们。
PPS:优化程序(使其运行时间更短)并不是真正的解决方案,因为我正在处理一个 29GB bz2 文件,该文件提取到大约 400GB xml,在单个线程上的速度约为每秒 10-40MB,所以即使在最大速度下,我会受到 I/O 的约束,并且仍然可以运行几个小时。