linux posix 线程池_在linux环境中,如何实现多线程中使用多个定时器,POSIX定时器可以吗,如何用?...

该博客给出了一个在Linux下基于POSIX线程池的定时器实现代码。代码中定义了硬件和软件定时器的超时处理函数,对线程属性进行初始化设置,创建并设置定时器时间,最后在主函数中让程序持续运行,实现定时功能。

展开全部

个人解决了,以下32313133353236313431303231363533e4b893e5b19e31333330356336是一个实现:

#include

#include

#include

#include

#include

#include

#include

#if 1

pthread_attr_t attr;

timer_t hard_timer, software_timer;

struct sigevent hard_evp, software_evp;

static void watchdog_hard_timeout(union sigval v)

{

time_t t;

char p[32];

timer_t *q;

struct itimerspec ts;

int ret;

time(&t);

strftime(p, sizeof(p), "%T", localtime(&t));

printf("watchdog hard timeout!\n");

printf("%s thread %d, val = %u, signal captured.\n", p, (unsigned int)pthread_self(), v.sival_int);

q = (timer_t *)(v.sival_ptr);

printf("hard timer_t:%d add:%p, q:%p!\n", (int)hard_timer, &hard_timer, q);

ts.it_interval.tv_sec = 0;

ts.it_interval.tv_nsec = 0;

ts.it_value.tv_sec = 6;

ts.it_value.tv_nsec = 0;

ret = timer_settime(*q, CLOCK_REALTIME, &ts, NULL);

if (ret != 0) {

printf("settime err(%d)!\n", ret);

}

}

static void watchdog_software_timeout(union sigval v)

{

time_t t;

char p[32];

timer_t *q;

struct itimerspec ts;

int ret;

time(&t);

strftime(p, sizeof(p), "%T", localtime(&t));

printf("watchdog software timeout!\n");

printf("%s thread %d, val = %u, signal captured.\n", p, (unsigned int)pthread_self(), v.sival_int);

q = (timer_t *)(v.sival_ptr);

printf("hard timer_t:%d add:%p, q:%p!\n", (int)hard_timer, &hard_timer, q);

ts.it_interval.tv_sec = 0;

ts.it_interval.tv_nsec = 0;

ts.it_value.tv_sec = 10;

ts.it_value.tv_nsec = 0;

ret = timer_settime(*q, CLOCK_REALTIME, &ts, NULL);

if (ret != 0) {

printf("settime err(%d)!\n", ret);

}

}

static void dcmi_sol_pthread_attr_destroy(pthread_attr_t *attr)

{

pthread_attr_destroy(attr);

}

static int dcmi_sol_pthread_attr_init(pthread_attr_t *attr)

{

int ret;

if ((ret = pthread_attr_init(attr) != 0)) {

goto err;

}

if ((ret = pthread_attr_setdetachstate(attr, PTHREAD_CREATE_DETACHED)) != 0) {

dcmi_sol_pthread_attr_destroy(attr);

goto err;

}

/* 设置线程的栈大小,失败则用系统默认值 */

pthread_attr_setstacksize(attr, 128 * 1024);

return 0;

err:

printf("set ptread attr failed(ret:%d)!\n", ret);

return -1;

}

int main(void)

{

struct itimerspec ts;

int ret;

ret = dcmi_sol_pthread_attr_init(&attr);

if (ret != 0) {

printf("init pthread attributes fail(%d)!\n", ret);

exit(-1);

}

memset(&hard_evp, 0, sizeof(struct sigevent));

hard_evp.sigev_value.sival_ptr = &hard_timer;

hard_evp.sigev_notify = SIGEV_THREAD;

hard_evp.sigev_notify_function = watchdog_hard_timeout;

hard_evp.sigev_notify_attributes = NULL;//&attr;

memset(&software_evp, 0, sizeof(struct sigevent));

software_evp.sigev_value.sival_ptr = &software_timer;

software_evp.sigev_notify = SIGEV_THREAD;

software_evp.sigev_notify_function = watchdog_software_timeout;

software_evp.sigev_notify_attributes = NULL;//&attr;

ret = timer_create(CLOCK_REALTIME, &hard_evp, &hard_timer);

if(ret != 0) {

perror("hard timer_create fail!");

exit(-1);

}

ret = timer_create(CLOCK_REALTIME, &software_evp, &software_timer);

if (ret != 0) {

timer_delete(hard_timer);

perror("software timer_create fail!");

exit(-1);

}

ts.it_interval.tv_sec = 0;

ts.it_interval.tv_nsec = 0;

ts.it_value.tv_sec = 6;

ts.it_value.tv_nsec = 0;

ret = timer_settime(hard_timer, CLOCK_REALTIME, &ts, NULL);

if(ret != 0) {

perror("hard timer_settime fail!");

timer_delete(hard_timer);

timer_delete(software_timer);

exit(-1);

}

ts.it_value.tv_sec = 10;

ret = timer_settime(software_timer, CLOCK_REALTIME, &ts, NULL);

if(ret != 0) {

perror("hard timer_settime fail!");

timer_delete(hard_timer);

timer_delete(software_timer);

exit(-1);

}

while(1) {

printf("main ready sleep!\n");

sleep(15);

printf("main sleep finish!\n");

}

return 0;

}

#endif

本回答由电脑网络分类达人 董辉推荐

已赞过

已踩过<

你对这个回答的评价是?

评论

收起

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值