Async is a lightweight concurrency framework for C 11. The concept was inspired by the Microsoft PPL library and the N3428 C standard proposal.
Here is a short example which shows some features of Async :
#include <iostream>
#include <async .h>
int main()
{
auto task1 = async::spawn([] {
std::cout << "Task 1 executes asynchronously" << std::endl;
});
auto task2 = async::spawn([]() -> int {
std::cout << "Task 2 executes in parallel with task 1" << std::endl;
return 42;
});
auto task3 = task2.then([](int value) -> int {
std::cout << "Task 3 executes after task 2, which returned "
<< value << std::endl;
return value * 3;
});
auto task4 = async::when_all(task1, task3);
auto task5 = task4.then([](std::tuple<async::task<void>,
async::task<int>> results) {
std::cout << "Task 5 executes after tasks 1 and 3. Task 3 returned "
<< std::get<1>(results).get() << std::endl;
});
task5.get();
std::cout << "Task 5 has completed" << std::endl;
async::parallel_invoke([] {
std::cout << "This is executed in parallel..." << std::endl;
}, [] {
std::cout << "with this" << std::endl;
});
async::parallel_for(async::irange(0, 5), [](int x) {
std::cout << x;
});
std::cout << std::endl;
int r = async::parallel_reduce({1, 2, 3, 4}, 0, [](int x, int y) {
return x y;
});
std::cout << "The sum of {1, 2, 3, 4} is " << r << std::endl;
}
// Output (order may vary in some places):
// Task 1 executes asynchronously
// Task 2 executes in parallel with task 1
// Task 3 executes after task 2, which returned 42
// Task 5 executes after tasks 1 and 3. Task 3 returned 126
// Task 5 has completed
// This is executed in parallel...
// with this
// 01234
// The sum of {1, 2, 3, 4} is 10
The only requirement to use Async is a C 11 compiler and standard library. Unfortunately C 11 is not yet fully implemented on most platforms. Here is the list of OS and compiler combinations which are known to work.
- Linux: Works with GCC 4.7 , Clang 3.2 and Intel compiler 15 .
- Mac: Works with Apple Clang (using libc ). GCC also works but you must get a recent version (4.7 ).
- iOS: Works with Apple Clang (using libc ). Note: because iOS has no thread local support, the library uses a workaround based on pthreads.
- Windows: Works with GCC 4.8 (with pthread-win32) and Visual Studio 2013 .
Instructions for compiling Async and using it in your code are available on the Building and Installing page.
The Async documentation is split into four parts:
- Tasks: This describes task objects which are the core Async . Reading this first is strongly recommended.
- Parallel algorithms: This describes functions to run work on ranges in parallel.
- Schedulers: This describes the low-level details of Async and how to customize it.
- API Reference: This gives detailed descriptions of all the classes and functions available in Async .
You can contact me by email at [email protected].