1. 程式人生 > >c++定時器

c++定時器

異步操作 回調函數 epoll cal name async class a bind posix

io_service的任務執行流程:
調用run方法,進入主loop;
判斷公有隊列是否為空,不為空則取出任務並執行,當任務數大於1時同時喚醒其他空閑線程;
任務執行結束,把各個線程的私有隊裏面的任務移動到公有任務隊列裏面。
觸發reactor,linux下面一般是epoll,當有事件時,把相應的事件的任務放到私有隊列裏。
當隊列為空時,把當前線程加到空閑線程隊列裏面,同時進入wait狀態,等待其他線程的喚醒。
當用戶調用post時,任務是直接投遞到公有隊列裏面。

io_service.run():開始執行隊列中的所有任務,直到任務執行完畢。

同步定時器:

#include <boost/thread.hpp>
#include <boost/asio.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>

int main()
{
	boost::asio::io_service ios; // 所有asio程序都必須要有一個io_service對象
	boost::asio::deadline_timer t(ios, boost::posix_time::seconds(2)); // 定時器
	std::cout << t.expires_at() << std::endl; // 查看定時器終止的絕對時間
	t.wait(); // 同步等待
	std::cout << "hello!" << std::endl;
	return 0;
}

  

異步定時器:

#include <boost/thread.hpp>
#include <boost/asio.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>

// error_code表示程序運行的錯誤
void call_back(const boost::system::error_code& e)
{
	std::cout << "I am call_back." << std::endl;
}

int main()
{
	boost::asio::io_service ios; // 所有asio程序都必須要有一個io_service對象
	boost::asio::deadline_timer t(ios, boost::posix_time::seconds(2)); // 定時器
	t.async_wait(call_back); // 異步等待,傳入回調函數
	std::cout << "我在定時器前面" << std::endl;
	ios.run(); // 等待異步操作完成,完成時io_service從操作系統獲取執行結果,調用完成處理函數
	return 0;
}

  

異步定時器使用bind

#include <boost/thread.hpp>
#include <boost/asio.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>

class a_timer
{
private:
	int count, count_max;
	boost::function<void()> f; // 無參無返回的可調用用
	boost::asio::deadline_timer t; // 定時器
public:
	template<typename F>
	a_timer(boost::asio::io_service &ios, int x, F func) :
		f(func), count_max(x), count(0), t(ios, boost::posix_time::millisec(500))
	{
		t.async_wait(boost::bind(&a_timer::call_func, this, _1)); // 註冊回調函數
	}
	void call_func(const boost::system::error_code &e)
	{
		if (count > count_max)
		{
			return;
		}
		++count;
		f();
		t.expires_at(t.expires_at() + boost::posix_time::millisec(500));
		t.async_wait(boost::bind(&a_timer::call_func, this, _1)); // 再次啟動定時器
	}
};
void print1()
{
	std::cout << "hello print1." << std::endl;
}
void print2()
{
	std::cout << "hello print2." << std::endl;
}
int main()
{
	boost::asio::io_service ios;
	a_timer t1(ios, 5, print1);
	a_timer t2(ios, 5, print2);
	ios.run(); // 異步等待調用結束
	return 0;
}

  

c++定時器