boost 提供了两种协程类型:对称协程(symmetric_coroutine)和非对称协程(asymmetric_coroutine)。

以下示例演示 symmetric_coroutine 的基本用法,分别创建一个收协程和一个发协程,两者交替切换执行:

#include "boost_1_60_0/boost/coroutine/coroutine.hpp"
                
                int main()
                {
                	using   Coroutine_t = boost::coroutines::symmetric_coroutine<int>;
                
                	Coroutine_t::call_type coro_recv(
                		[&](Coroutine_t::yield_type& yield) {
                		//loop for recv
                		for (;;)
                		{
                			std::cout << yield.get() << " recv" << endl;
                			yield(); //give up time  slice and jump back to starting context
                		}
                	});
                
                	Coroutine_t::call_type coro_send(
                		[&](Coroutine_t::yield_type& yield) {
                		//loop for send
                		for (;;)
                		{
                			yield.get();
                			std::cout << yield.get() << " send" << endl;
                			yield();
                		}
                	});
                
                
                	while (true)
                	{
                		coro_recv(1); //recv
                
                		coro_send(1); // send
                
                	}
                
                	system("pause");
                
                	return 0;
                }
                

此外,可以结合 ASIO 的定时器与协程来完成定时任务。以下示例创建两个协程,分别以 1 秒和 500 毫秒为间隔轮询执行:

#include "boost_1_60_0/boost/asio/steady_timer.hpp"
                #include "boost_1_60_0/boost/asio/spawn.hpp"
                int main()
                {
                	boost::asio::io_service io;
                
                	boost::asio::steady_timer timer(io);
                	using namespace boost::asio;
                
                
                	//协程1
                	spawn(io, [&](yield_context yield) {
                		while (true)
                		{
                			boost::asio::steady_timer timer(io);
                			timer.expires_from_now(std::chrono::seconds(1));
                			timer.async_wait(yield);
                
                			cout << "1111111111" << endl;;
                		}
                	});
                
                	//协程2
                	spawn(io, [&](yield_context yield) {
                		while (true)
                		{
                			boost::asio::steady_timer timer(io);
                			timer.expires_from_now(std::chrono::milliseconds(500));
                			timer.async_wait(yield);
                
                			cout << "22222222222"<<endl;
                		}
                	});
                
                
                	io.run();//
                
                
                
                	while (true)
                	{
                		Sleep(100);
                	}
                
                
                	system("pause");
                
                	return 0;
                }