@@ -12,9 +12,9 @@ librf是一个基于C++ Coroutines提案 ‘Stackless Resumable Functions’编 | |||
librf有以下特点: | |||
* 1.基于C++17提案'Stackless Resumable Functions'编写的非对称stackless协程库,可以以同步的方式编写简单的代码,同时获得异步的性能 | |||
* 2.理论上支持海量协程, 创建100万个协程只需使用<待测试>物理内存 | |||
* 2.理论上支持海量协程, 创建100万个协程只需使用<820M>物理内存 | |||
* 3.提供协程锁(mutex), 定时器, channel等特性, 帮助用户更加容易地编写程序 | |||
* 4.可以很好的跟asio,libuv等库结合,能更现有的callback范式的异步/延迟代码结合 | |||
* 4.可以很好的跟asio,libuv等库结合,能跟现有的callback范式的异步/延迟代码很好的结合 | |||
* 5.目前还处于实验状态,不对今后正式的C++ Coroutines支持有任何正式的承诺 | |||
* 如果你发现了任何bug、有好的建议、或使用上有不明之处,可以提交到issue,也可以直接联系作者: |
@@ -0,0 +1,26 @@ | |||
| |||
#include <chrono> | |||
#include <iostream> | |||
#include <string> | |||
#include <conio.h> | |||
#include <thread> | |||
#include "librf.h" | |||
const size_t N = 1000000; | |||
void resumable_main_benchmark_mem() | |||
{ | |||
using namespace std::chrono; | |||
for (size_t i = 0; i < N; ++i) | |||
{ | |||
GO | |||
{ | |||
for(size_t k = 0; k<100; ++k) | |||
co_await resumef::sleep_for(10s); | |||
}; | |||
} | |||
resumef::g_scheduler.run_until_notask(); | |||
} |
@@ -14,11 +14,10 @@ auto async_get_long(int64_t val) | |||
resumef::promise_t<int64_t> awaitable; | |||
std::thread([val, st = awaitable._state->lock()] | |||
std::thread([val, st = awaitable._state] | |||
{ | |||
std::this_thread::sleep_for(500ms); | |||
st->set_value(val * val); | |||
st->unlock(); | |||
}).detach(); | |||
return awaitable.get_future(); |
@@ -15,8 +15,13 @@ extern void resumable_main_dynamic_go(); | |||
extern void resumable_main_channel(); | |||
extern void resumable_main_cb(); | |||
extern void resumable_main_benchmark_mem(); | |||
int main(int argc, const char * argv[]) | |||
{ | |||
resumable_main_benchmark_mem(); | |||
return 0; | |||
resumable_main_yield_return(); | |||
resumable_main_timer(); | |||
resumable_main_suspend_always(); |
@@ -89,7 +89,7 @@ | |||
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> | |||
<SDLCheck>true</SDLCheck> | |||
<AdditionalIncludeDirectories>..\librf;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> | |||
<AdditionalOptions>/await /stdlast++ %(AdditionalOptions)</AdditionalOptions> | |||
<AdditionalOptions>/await /std:c++latest </AdditionalOptions> | |||
</ClCompile> | |||
<Link> | |||
<SubSystem>Console</SubSystem> | |||
@@ -103,7 +103,7 @@ | |||
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> | |||
<SDLCheck>true</SDLCheck> | |||
<AdditionalIncludeDirectories>..\librf;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> | |||
<AdditionalOptions>/await /std:c++latest %(AdditionalOptions)</AdditionalOptions> | |||
<AdditionalOptions>/await /std:c++latest </AdditionalOptions> | |||
</ClCompile> | |||
<Link> | |||
<SubSystem>Console</SubSystem> | |||
@@ -119,7 +119,7 @@ | |||
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> | |||
<SDLCheck>true</SDLCheck> | |||
<AdditionalIncludeDirectories>..\librf;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> | |||
<AdditionalOptions>/await /stdlast++ %(AdditionalOptions)</AdditionalOptions> | |||
<AdditionalOptions>/await /std:c++latest </AdditionalOptions> | |||
</ClCompile> | |||
<Link> | |||
<SubSystem>Console</SubSystem> | |||
@@ -137,7 +137,7 @@ | |||
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> | |||
<SDLCheck>true</SDLCheck> | |||
<AdditionalIncludeDirectories>..\librf;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> | |||
<AdditionalOptions>/await /stdlast++ %(AdditionalOptions)</AdditionalOptions> | |||
<AdditionalOptions>/await /std:c++latest </AdditionalOptions> | |||
</ClCompile> | |||
<Link> | |||
<SubSystem>Console</SubSystem> | |||
@@ -147,6 +147,7 @@ | |||
</Link> | |||
</ItemDefinitionGroup> | |||
<ItemGroup> | |||
<ClCompile Include="..\benchmark\benchmark_async_mem.cpp" /> | |||
<ClCompile Include="..\librf\src\event.cpp" /> | |||
<ClCompile Include="..\librf\src\mutex.cpp" /> | |||
<ClCompile Include="..\librf\src\rf_task.cpp" /> |
@@ -17,6 +17,9 @@ | |||
<Filter Include="tutorial"> | |||
<UniqueIdentifier>{d82e4930-c171-4b70-9ebb-cdec7218ff9c}</UniqueIdentifier> | |||
</Filter> | |||
<Filter Include="benchmark"> | |||
<UniqueIdentifier>{0fd1274a-193b-4d6a-b19e-58db935ed5c6}</UniqueIdentifier> | |||
</Filter> | |||
</ItemGroup> | |||
<ItemGroup> | |||
<ClCompile Include="librf.cpp"> | |||
@@ -79,6 +82,9 @@ | |||
<ClCompile Include="..\tutorial\test_async_yield_return.cpp"> | |||
<Filter>tutorial</Filter> | |||
</ClCompile> | |||
<ClCompile Include="..\benchmark\benchmark_async_mem.cpp"> | |||
<Filter>benchmark</Filter> | |||
</ClCompile> | |||
</ItemGroup> | |||
<ItemGroup> | |||
<ClInclude Include="..\librf\librf.h"> |