对称协程 symmetric_coroutine
非对称协程 asymmetric_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;
}
- #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;
- }
#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 的 定时器 和协程 来完成 定时任务
#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;
}
- #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;
- }
#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;
}