等待监听int类型变量值,是否变化,进行相应操作 等待监听int类型变量值是否变化进行相应操作volatile int g_playback_finish 1; int playback_fd -1; // 初始化 回放完成标志文件描述符 void init_playback_fd() { playback_fd eventfd(0, 0); } // 设置完成唤醒 select监听事件 void set_finish_playback_fd() { g_playback_finish 1; uint64_t val 1; write(playback_fd, val, 8); // 唤醒 select } // 等待完成超时2秒返回1完成0超时 int wait_finish_playback_fd() { // 已经完成了 if (g_playback_finish 1) { return 1; } // 等待2秒 fd_set fds; FD_ZERO(fds); FD_SET(playback_fd, fds); struct timeval tv {3, 0}; // 1秒 int ret select(playback_fd 1, fds, NULL, NULL, tv); if (ret 0) { uint64_t val; read(playback_fd, val, 8); // 清空事件 if (g_playback_finish 1) { return 1; // 确实是完成 } else { // 误唤醒继续等待或者返回0 // 建议返回0让调用者重试 return 0; } } return 0; // 超时 } void deinit_playback_fd() { close(playback_fd); } // 调用示例 void *ss_thread_led() { ... } int main() { init_playback_fd(); if (pthread_create(thread_led, NULL, ss_thread_led, NULL) ! 0) { ss_log_err(thread_led created failed); return -24; } ss_log_info( thread_led created); while(1) { int ret wait_finish_playback_fd(); if(ret 1) { if(ss_sdcard_get_status() 1) { g_playback_stop 0; g_playback_auto_continue 1; ret s_playback_start(handle, req-stTimeDay); } } sleep(1); } if (pthread_join(thread_led, NULL) ! 0) { ss_log_err(pthread_join thread_led failed); return -24; } ss_log_info( thread_led thread joined); deinit_playback_fd(); }