在 Linux C 应用编程中,对于多线程编程中的定时器函数使用,通常可以借助 pthread
库和系统提供的定时器相关的函数来实现。
首先,常见的定时器函数有 setitimer()
和 alarm()
。setitimer()
函数可以更精确地设置定时器,它可以设置为 ITIMER_REAL
(以实时时间递减)、ITIMER_VIRTUAL
(以进程在用户态执行的时间递减)和 ITIMER_PROF
(以进程在用户态和内核态执行的时间递减)三种模式。
cpp
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#include <signal.h>
#include <time.h>
#define TIMER_INTERVAL_SEC 2
void timer_handler(union sigval sv)
{
printf("Timer expired. Thread ID: %ld\n", pthread_self());
}
void* thread_function(void* arg)
{
timer_t timer_id;
struct sigevent sev;
sev.sigev_notify = SIGEV_THREAD;
sev.sigev_notify_function = timer_handler;
sev.sigev_value.sival_ptr = &timer_id;
timer_create(CLOCK_REALTIME, &sev, &timer_id);
struct itimerspec its;
its.it_interval.tv_sec = TIMER_INTERVAL_SEC;
its.it_interval.tv_nsec = 0;
its.it_value.tv_sec = 1;
its.it_value.tv_nsec = 0;
timer_settime(timer_id, 0, &its, NULL);
while (1) {
sleep(1);
}
timer_delete(timer_id);
pthread_exit(NULL);
}
int main()
{
pthread_t thread_id1, thread_id2;
pthread_create(&thread_id1, NULL, thread_function, NULL);
pthread_create(&thread_id2, NULL, thread_function, NULL);
pthread_join(thread_id1, NULL);
pthread_join(thread_id2, NULL);
return 0;
}
cpp
#include <stdio.h>
#include <time.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
#define TIMER_SIG SIGRTMIN
void timer_handler(int sig, siginfo_t *si, void *uc) {
// 定时器到期时被调用的处理函数
printf("Timer fired!\n");
}
int main() {
timer_t timerid;
struct sigevent sev;
struct itimerspec its;
struct sigaction sa;
// 设置处理函数
sa.sa_flags = SA_SIGINFO;
sa.sa_sigaction = timer_handler;
sigemptyset(&sa.sa_mask);
if (sigaction(TIMER_SIG, &sa, NULL) == -1) {
perror("sigaction");
exit(1);
}
// 创建定时器
sev.sigev_notify = SIGEV_SIGNAL;
sev.sigev_signo = TIMER_SIG;
sev.sigev_value.sival_ptr = &timerid;
if (timer_create(CLOCK_REALTIME, &sev, &timerid) == -1) {
perror("timer_create");
exit(1);
}
// 启动定时器
its.it_value.tv_sec = 2; // 初次到期时间,2秒后
its.it_value.tv_nsec = 0;
its.it_interval.tv_sec = 1; // 定时器周期,每隔1秒
its.it_interval.tv_nsec = 0;
if (timer_settime(timerid, 0, &its, NULL) == -1) {
perror("timer_settime");
exit(1);
}
sleep(10); // 等待定时器触发几次
return 0;
}