Linux多线程C语言编程中,如何使用POSIX定时器设置2ms打印“定时器”,但是不会影响其他线程的运行,请给出相应代码并作出详细解释
时间: 2024-12-08 15:18:28 浏览: 83
在Linux多线程环境下,你可以使用POSIX API中的`timer_create()`、`timer_settime()`和`timer_gettime()`函数来创建和管理定时器,同时利用信号处理(signal handler)来避免阻塞主线程。这里是一个简单的示例代码,它在一个单独的线程中设置一个2毫秒的定时器,并打印消息:
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <sys/timer.h>
#include <unistd.h>
#define TIMER_INTERVAL_MS 2
// 定义一个回调函数,当定时器触发时会被调用
void timer_handler(struct itimerspec *it, void *data) {
pthread_mutex_lock(&mutex); // 确保互斥访问
printf("定时器触发 (间隔 %d ms)\n", TIMER_INTERVAL_MS);
pthread_mutex_unlock(&mutex); // 解锁
}
int main() {
pthread_t timer_thread;
struct sigevent sev;
struct itimerspec its;
// 初始化定时器相关的结构体
sev.sigev_notify = SIGEV_THREAD_ID; // 使用信号发送给特定线程
sev.sigev_signo = SIGRTMIN + 1; // 避免系统信号抢占
sev.sigev_value.sival_ptr = &timer_thread; // 指向新线程
// 创建一个定时器句柄
if ((timerid = timer_create(CLOCK_MONOTONIC, &sev, NULL)) == -1) {
perror("Failed to create timer");
return -1;
}
// 设置定时器时间为2毫秒
its.it_interval.tv_sec = 0;
its.it_interval.tv_nsec = TIMER_INTERVAL_MS * 1000000; // ns转换成us
its.it_value.tv_sec = 0;
its.it_value.tv_nsec += its.it_interval.tv_nsec;
// 如果定时器设置失败
if (timer_settime(timerid, 0, &its, NULL) == -1) {
perror("Failed to set timer interval");
return -1;
}
// 启动一个新的线程去处理定时器事件
pthread_attr_init(&attr);
pthread_attr_setscope(&attr, PTHREAD_PROCESS_PRIVATE); // 局部作用域
pthread_create(&timer_thread, &attr, timer_thread_entry, NULL);
pthread_attr_destroy(&attr);
while (true) { // 主线程继续执行,不会阻塞
sleep(1);
}
return 0;
}
// 新建的线程函数
void *timer_thread_entry(void *arg) {
signal(SIGRTMIN + 1, timer_handler); // 绑定信号处理器
pthread_detach(pthread_self()); // 线程不再需要主线程控制
return NULL;
}
int main_key() {
pthread_mutex_init(&mutex, NULL); // 锁用于保护输出
return main();
}
阅读全文
相关推荐

















