问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

C语言实现多个计时的三种方法

创作时间:
作者:
@小白创作中心

C语言实现多个计时的三种方法

引用
1
来源
1.
https://docs.pingcode.com/baike/1303972

在C语言开发中,有时需要同时进行多个计时任务。本文将详细介绍三种实现方法:多线程、信号处理和定时器库,并提供具体的代码示例。

在C语言中,进行多个计时的方法包括使用多线程、信号处理、以及利用定时器库。多线程是最常用的方法之一,它允许程序在不同的线程中分别进行计时,从而实现并行计时。信号处理也是一种有效的方法,通过捕获信号,执行特定的计时任务。利用定时器库如POSIX定时器(timer_create、timer_settime)可以更精确地管理多个计时任务。以下将详细介绍如何通过多线程来实现多个计时。

一、多线程实现多个计时

多线程是解决多个计时任务的常用方法。每个计时任务在一个独立的线程中运行,互不干扰,从而实现并行计时。

1、多线程的基本概念

多线程是一种并发编程技术,它允许程序同时执行多个线程,每个线程可以独立完成特定的任务。在C语言中,POSIX线程(pthread)库是实现多线程的主要工具。

#include <pthread.h>
#include <stdio.h>  
#include <stdlib.h>  
#include <unistd.h>  

void* timer_function(void* arg) {  
    int timer_id = *((int*)arg);  
    for (int i = 0; i < 10; i++) {  
        printf("Timer %d: %d seconds\n", timer_id, i);  
        sleep(1);  
    }  
    pthread_exit(NULL);  
}  

int main() {  
    pthread_t threads[3];  
    int timer_ids[3] = {1, 2, 3};  
    for (int i = 0; i < 3; i++) {  
        int rc = pthread_create(&threads[i], NULL, timer_function, (void*)&timer_ids[i]);  
        if (rc) {  
            printf("Error:unable to create thread, %d\n", rc);  
            exit(-1);  
        }  
    }  
    for (int i = 0; i < 3; i++) {  
        pthread_join(threads[i], NULL);  
    }  
    return 0;  
}  

上述代码中,创建了三个线程,每个线程独立进行计时。每个线程都会调用timer_function函数,该函数通过一个循环来模拟计时,每秒钟打印一次计时信息。

2、多线程同步与互斥

在多线程编程中,线程之间可能会共享资源,因此需要考虑同步与互斥。POSIX线程库提供了多种同步机制,如互斥锁(mutex)、条件变量(condition variable)等。

#include <pthread.h>
#include <stdio.h>  
#include <stdlib.h>  
#include <unistd.h>  

pthread_mutex_t mutex;  

void* timer_function(void* arg) {  
    int timer_id = *((int*)arg);  
    for (int i = 0; i < 10; i++) {  
        pthread_mutex_lock(&mutex);  
        printf("Timer %d: %d seconds\n", timer_id, i);  
        pthread_mutex_unlock(&mutex);  
        sleep(1);  
    }  
    pthread_exit(NULL);  
}  

int main() {  
    pthread_t threads[3];  
    int timer_ids[3] = {1, 2, 3};  
    pthread_mutex_init(&mutex, NULL);  
    for (int i = 0; i < 3; i++) {  
        int rc = pthread_create(&threads[i], NULL, timer_function, (void*)&timer_ids[i]);  
        if (rc) {  
            printf("Error: unable to create thread, %d\n", rc);  
            exit(-1);  
        }  
    }  
    for (int i = 0; i < 3; i++) {  
        pthread_join(threads[i], NULL);  
    }  
    pthread_mutex_destroy(&mutex);  
    return 0;  
}  

在上述代码中,使用了互斥锁(mutex)来保护共享资源,确保多个线程在访问共享资源时不会发生冲突。

二、信号处理实现多个计时

信号是操作系统向进程发送的一种异步通知机制,可以用来处理异步事件。通过捕获和处理信号,可以实现多个计时任务。

1、信号的基本概念

信号是一种软件中断,常用于通知进程某些事件的发生。在C语言中,可以使用signal函数来捕获和处理信号。

#include <signal.h>
#include <stdio.h>  
#include <unistd.h>  

void signal_handler(int signum) {  
    static int count1 = 0;  
    static int count2 = 0;  
    if (signum == SIGUSR1) {  
        printf("Timer 1: %d seconds\n", count1++);  
    } else if (signum == SIGUSR2) {  
        printf("Timer 2: %d seconds\n", count2++);  
    }  
}  

int main() {  
    signal(SIGUSR1, signal_handler);  
    signal(SIGUSR2, signal_handler);  
    while (1) {  
        raise(SIGUSR1);  
        sleep(1);  
        raise(SIGUSR2);  
        sleep(1);  
    }  
    return 0;  
}  

上述代码中,通过signal函数捕获SIGUSR1SIGUSR2信号,并在信号处理函数中分别进行计时。

2、使用setitimer函数进行定时

setitimer函数可以设置一个间隔定时器,定时器到期后发送信号。可以利用setitimer函数实现多个计时任务。

#include <signal.h>
#include <stdio.h>  
#include <stdlib.h>  
#include <sys/time.h>  
#include <unistd.h>  

void timer_handler(int signum) {  
    static int count = 0;  
    printf("Timer: %d seconds\n", count++);  
}  

int main() {  
    struct itimerval timer;  
    signal(SIGALRM, timer_handler);  
    timer.it_value.tv_sec = 1;  
    timer.it_value.tv_usec = 0;  
    timer.it_interval.tv_sec = 1;  
    timer.it_interval.tv_usec = 0;  
    setitimer(ITIMER_REAL, &timer, NULL);  
    while (1) {  
        pause();  
    }  
    return 0;  
}  

上述代码中,通过setitimer函数设置一个间隔定时器,每秒钟发送一次SIGALRM信号,信号处理函数中进行计时任务。

三、利用定时器库实现多个计时

POSIX定时器库提供了更加精确和灵活的定时器功能,可以实现多个计时任务。

1、使用POSIX定时器

POSIX定时器通过timer_createtimer_settime等函数来创建和管理定时器。

#include <stdio.h>
#include <stdlib.h>  
#include <signal.h>  
#include <time.h>  

void timer_handler(union sigval sv) {  
    int timer_id = *((int*)sv.sival_ptr);  
    printf("Timer %d expired\n", timer_id);  
}  

int main() {  
    timer_t timers[3];  
    struct sigevent sev;  
    struct itimerspec its;  
    int timer_ids[3] = {1, 2, 3};  
    for (int i = 0; i < 3; i++) {  
        sev.sigev_notify = SIGEV_THREAD;  
        sev.sigev_value.sival_ptr = &timer_ids[i];  
        sev.sigev_notify_function = timer_handler;  
        sev.sigev_notify_attributes = NULL;  
        if (timer_create(CLOCK_REALTIME, &sev, &timers[i]) == -1) {  
            perror("timer_create");  
            exit(EXIT_FAILURE);  
        }  
        its.it_value.tv_sec = 1;  
        its.it_value.tv_nsec = 0;  
        its.it_interval.tv_sec = 1;  
        its.it_interval.tv_nsec = 0;  
        if (timer_settime(timers[i], 0, &its, NULL) == -1) {  
            perror("timer_settime");  
            exit(EXIT_FAILURE);  
        }  
    }  
    while (1) {  
        pause();  
    }  
    return 0;  
}  

上述代码中,通过timer_create函数创建了三个定时器,每个定时器到期后都会调用timer_handler函数进行计时任务。

四、总结

在C语言中,实现多个计时的方法包括使用多线程、信号处理以及利用定时器库。多线程方法通过创建多个线程来实现并行计时,适用于需要并发执行任务的场景。信号处理方法通过捕获和处理信号来实现计时,适用于简单的计时任务。利用定时器库方法可以提供更加精确和灵活的定时器功能,适用于复杂的计时需求。在实际开发中,可以根据具体需求选择合适的方法来实现多个计时任务。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号