在跳出while循环之前程序会发生阻塞
时间: 2023-10-22 19:37:42 浏览: 75
如果在跳出 while 循环之前程序会发生阻塞,那可能是因为在执行操作时涉及到了阻塞的操作,比如文件读写、网络通信等。为了避免这种情况,可以将操作放到一个新的线程中执行,避免阻塞主线程。修改后的代码如下:
```c++
#include <thread>
bool check_condition(const std::string& logs_path) {
auto now1 = std::chrono::system_clock::now();
std::time_t now_c1 = std::chrono::system_clock::to_time_t(now1);
std::tm parts1 = *std::localtime(&now_c1);
if (parts1.tm_min % 10 == 0) {
std::string folder_name = logs_path + get_current_time();
std::thread t(create_folder, folder_name);
t.detach(); // 将新线程分离,避免阻塞主线程
return true;
}
return false;
}
int main(int argc, char** argv) {
std::string logs_path = "/home/sage/logs/";
std::string folder1_name = logs_path + get_current_time_M_10();
std::thread t1(create_folder, folder1_name);
t1.detach(); // 将新线程分离,避免阻塞主线程
ros::init(argc, argv, "log_fetch");
ros::NodeHandle nh;
ros::Subscriber sub = nh.subscribe("/rosout", 1000, callback);
ros::Timer timer1 = nh.createTimer(ros::Duration(600), new_folder_callback);
bool s = false;
while (!s) {
s = check_condition(logs_path);
std::this_thread::sleep_for(std::chrono::seconds(5));
}
ros::spin();
return 0;
}
void new_folder_callback(const ros::TimerEvent&){
std::string folder_name = logs_path + get_current_time();
std::thread t(create_folder, folder_name);
t.detach(); // 将新线程分离,避免阻塞主线程
}
```
其中,create_folder() 函数会在一个新的线程中执行,可以避免阻塞主线程。在 check_condition() 和 new_folder_callback() 函数中,使用 std::thread 创建一个新线程来执行 create_folder() 函数,然后将该线程分离,避免阻塞主线程。这样一来,即使在执行操作时发生阻塞,也不会影响主线程的运行。
阅读全文