如何利用多线程写一个简单的定时器?

972 篇文章 327 订阅
32 篇文章 6 订阅

       先来看一个简单的程序, 实现一个定时器来定时调用test函数:

 

#include <iostream>
#include <windows.h>
using namespace std;

void test()
{
	cout << "test" << endl;
}

DWORD WINAPI ThreadFun(LPVOID pM)
{
	int timeVal = *(int *)pM;
	while(1)
	{
		test();

		Sleep(timeVal); // 3s调用一次test
	}

	return 0;
}

int main()
{
	int timeVal = 3000;
	HANDLE handle = CreateThread(NULL, 0, ThreadFun,  &timeVal, 0, NULL);
	CloseHandle(handle);

	while(1);

	return 0;
}

       然而, 上述是有问题的, 没有考虑test函数本身的执行时间, 例如, 下面程序实际上是5秒执行一次test

 

 

#include <iostream>
#include <windows.h>
using namespace std;

void test()
{
	cout << "test" << endl;
	Sleep(2000);
}

DWORD WINAPI ThreadFun(LPVOID pM)
{
	int timeVal = *(int *)pM;
	while(1)
	{
		int start = GetTickCount();  
		test();

		Sleep(timeVal); // 实际是5s调用一次test
	}

	return 0;
}

int main()
{
	int timeVal = 3000;
	HANDLE handle = CreateThread(NULL, 0, ThreadFun,  &timeVal, 0, NULL);
	CloseHandle(handle);

	while(1);

	return 0;
}

      改进后的程序为:

 

 

#include <iostream>
#include <windows.h>
using namespace std;

void test()
{
	cout << "test" << endl;
	Sleep(2000); // 假设此处不超过3s
}

DWORD WINAPI ThreadFun(LPVOID pM)
{
	int timeVal = *(int *)pM;
	while(1)
	{
		int start = GetTickCount();  
		test();
		
		while(GetTickCount() - start < timeVal)
		{
			Sleep(10);
		}
	}

	return 0;
}

int main()
{
	int timeVal = 3000;
	HANDLE handle = CreateThread(NULL, 0, ThreadFun,  &timeVal, 0, NULL);
	CloseHandle(handle);

	while(1);

	return 0;
}

        该程序是3s调用一次test函数。

 


        诚然, 上述程序也没有考虑一些特殊和异常的情况(比如test函数本身时间超过3s, 那代码就有问题了), 在本文中, 我们仅仅讨论一种可行的方法, 如果在具体项目中, 还需要更加完善更加健壮的代码。


 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Linux中,同一个线程可以创建多个定时器。在Linux系统中,有一个名为timerfd的机制可以用于创建定时器。通过创建多个timerfd,可以实现多个定时器。 创建定时器需要以下步骤: 1. 使用`timerfd_create`函数创建一个新的定时器描述符。该函数返回一个整数值,该值可以被用作后续操作的参数。 2. 使用`timerfd_settime`函数设置定时器的初始时间和间隔时间。该函数将定时器描述符作为参数,因此可以使用不同的timerfd来设置不同的定时器。 3. 使用`read`或`poll`等函数来等待定时器超时事件。当定时器达到指定的时间时,定时器描述符会变得可读,进而可以进行相应的处理。 需要注意的是,虽然同一个线程可以创建多个定时器,但是定时器一般是在操作系统内部进行管理的。因此,对于同一个线程来说,并不能直接控制定时器的触发顺序。所以,在使用多个定时器时,应该合理安排定时器的触发时机,以避免逻辑上的混乱。 总而言之,使用Linux系统提供的timerfd机制,同一个线程可以创建多个定时器,通过适当设置定时器的初始时间和间隔,可以实现不同定时器的功能。 ### 回答2: 在Linux中,同一个线程可以创建多个定时器定时器是一种用来指定在未来的某个时间点执行特定任务的机制。Linux提供了一些API用于创建和管理定时器,最常用的是timer_create、timer_settime和timer_delete等函数。 在同一个线程中创建多个定时器可以用于同时执行多个不同的任务或者按照不同的时间间隔执行同一任务。 首先,需要调用timer_create函数来创建定时器。该函数会返回一个定时器的标识符,我们可以根据这个标识符来设置定时器的属性。 然后,使用timer_settime函数来设置定时器的首次超时时间和周期性超时时间。这个函数需要传入定时器的标识符、定时器的属性和一个结构体来指定每次超时后的处理方式(例如执行一个回调函数)。 最后,如果不再需要某个定时器,可以使用timer_delete函数来删除它。 需要注意的是,使用多个定时器时要注意避免竞争条件或者资源争用问题。可以利用互斥锁或者条件变量等同步机制来保证在多个定时器之间的正确执行顺序和资源的正确访问。 总之,在Linux中,同一个线程是可以创建多个定时器的,可以根据需求设置不同的超时时间和处理方式,从而实现多任务或者多时间间隔执行的功能。 ### 回答3: 在Linux中,可以使用线程来创建多个定时器。每个线程可以通过调用`timer_create()`函数来创建一个定时器,并使用`timer_settime()`函数来设置定时器的参数和启动定时器。 要在同一个线程中创建多个定时器,可以在使用`timer_create()`函数时,为每个定时器指定不同的定时器ID。这样,每个定时器都会有一个唯一的标识符,以便在后续的操作中能够区分和处理不同的定时器。 在每个定时器到期时,可以通过为每个定时器关联一个回调函数来执行相应的操作。当定时器到期时,内核会调用指定的回调函数,然后可以在回调函数中进行相应的处理逻辑。 除了创建和设置定时器,还可以使用`timer_delete()`函数来删除和销毁不再需要的定时器。在不需要某个定时器时,可以调用该函数将其从系统中删除,从而释放相关的资源。 需要注意的是,如果在同一个线程中创建多个定时器,要确保能够正确处理并发的问题。可能需要使用同步机制(如互斥锁或条件变量)来保护共享的数据结构,以防止多个定时器同时访问和修改同一份数据。 总之,可以通过在同一个线程中使用不同的定时器ID来创建多个定时器。在每个定时器到期时,通过关联的回调函数可以执行相应的操作。然后,在不需要的定时器时,可以使用`timer_delete()`函数将其删除和销毁。为了避免并发问题,可能需要使用同步机制来保护共享数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值