SlideShare ist ein Scribd-Unternehmen logo
1 von 43
Downloaden Sie, um offline zu lesen
Concurrency and
Parallelism with
C++17 and
C++20/23
Rainer Grimm
Training, Coaching and,
Technology Consulting
www.ModernesCpp.de
Concurrency and Parallelism in C++
Concurrency and Parallelism in C++17
You can choose the execution policy of an algorithm.
â–Ș Execution policies
std::execution::seq
â–Ș Sequential in one thread
std::execution::par
â–Ș Parallel
std::execution::par_unseq
â–Ș Parallel and vectorised SIMD
Parallel STL
Parallel STL
Not vectorised Vectorised
const int SIZE = 8;
int vec[]={1, 2 , 3, 4, 5, 6, 7, 8};
int res[SIZE] = {0,};
int main(){
for (int i= 0; i < SIZE; ++i){
res[i] = vec[i] + 5;
}
}
using namespace std;
vector<int> vec = {1, 2, 3, 4, 5, .... }
sort(vec.begin(), vec.end()); // sequential as ever
sort(execution::seq, vec.begin(), vec.end()); // sequential
sort(execution::par, vec.begin(), vec.end()); // parallel
sort(execution::par_unseq, vec.begin(), vec.end()); // par + vec
Parallel STL
Parallel STL
adjacent_difference, adjacent_find, all_of any_of, copy,
copy_if, copy_n, count, count_if, equal, exclusive_scan,
fill, fill_n, find, find_end, find_first_of, find_if,
find_if_not, for_each, for_each_n, generate, generate_n,
includes, inclusive_scan, inner_product, inplace_merge,
is_heap, is_heap_until, is_partitioned, is_sorted,
is_sorted_until, lexicographical_compare, max_element,
merge, min_element, minmax_element, mismatch, move,
none_of, nth_element, partial_sort, partial_sort_copy,
partition, partition_copy, reduce, remove, remove_copy,
remove_copy_if, remove_if, replace, replace_copy,
replace_copy_if, replace_if, reverse, reverse_copy,
rotate, rotate_copy, search, search_n, set_difference,
set_intersection, set_symmetric_difference, set_union,
sort, stable_partition, stable_sort, swap_ranges,
transform, transform_exclusive_scan,
transform_inclusive_scan, transform_reduce,
uninitialized_copy, uninitialized_copy_n,
uninitialized_fill, uninitialized_fill_n, unique,
unique_copy
Parallel STL
std::transform_reduce
â–Ș Haskells function map is called std::transform in C++
â–Ș std::transform_reduce std::map_reduce
Parallel STL
â–Ș Danger of data races or deadlocks
The access to numComp has to be atomic.
int numComp = 0;
vector<int> vec = {1, 3, 8, 9, 10};
sort(execution::par, vec.begin(), vec.end(),
[&numComp](int fir, int sec){ numComp++; return fir < sec; }
);
Concurrency and Parallelism in C++20/23
Executors
Executors are the basic building block for execution in C++.
â–Ș They fulfil a similar role for execution such as allocators for
allocation.
An executor consists of a set of rules for a callables:
â–Ș Where: run on a internal or external processor
â–Ș When: run immediately or later
â–Ș How: run on a CPU or GPU
Executors
â–Ș Using an executor
my_executor_type my_executor = ... ;
auto future = std::async(my_executor, []{
std::cout << "Hello world " << std::endl; }
);
std::for_each(std::execution::par.on(my_executor),
data.begin(), data.end(), func);
â–Ș Obtaining an executor
static_thread_pool pool(4);
auto exec = pool.executor();
task1 = long_running_task(exec);
Executors
An executor provides one or more execution functions for
creating a callable.
Name Cardinality Direction
execute single oneway
twoway_execute single twoway
then_execute single then
bulk_execute bulk oneway
bulk_twoway_execute bulk twoway
bulk_then_execute bulk then
Cardinality: Creation of one execution agent or a group of execution agents.
Direction: Directions of the execution.
std::jthread
Problem: std::thread throws std::terminate in its
destructor if still joinable.
std::thread t{[]{ std::cout << "New thread"; }};
std::cout << "t.joinable(): " << t.joinable();
std::jthread
Solution: std::jthread joins automatically at the end of
its scope.
std::jthread t{[]{ std::cout << "New thread"; }};
std::cout << "t.joinable(): " << t.joinable();
std::jthread
â–Ș Instances of std::jthread can be interrupted
Receiver
â–Ș Explicit check:
â–Ș is_interrupted: yields, when an interrupt was signalled
â–Ș std::condition_variable wait variations with predicate
Sender
â–Ș interrupt: signals an interrupt (and returns whether an interrupt
was signaled before)
std::jthread
jthread nonInterruptable([]{
int counter{0};
while (counter < 10){
this_thread::sleep_for(0.2s);
cerr << "nonInterruptable: "
<< counter << endl;
++counter;
}
});
jthread interruptable([](interrupt_token
itoken){
int counter{0};
while (counter < 10){
this_thread::sleep_for(0.2s);
if (itoken.is_interrupted()) return;
cerr << "interruptable: "
<< counter << endl;
++counter;
}
});
this_thread::sleep_for(1s);
cerr << endl;
cerr << "Main thread interrupts both jthreads" << endl;
nonInterruptable.interrupt();
interruptable.interrupt();
cout << endl;
std::jthread
C++11 has a std::shared_ptr for shared ownership.
â–Ș General Rule:
â–Ș You should use smart pointers.
â–Ș But:
â–Ș The managing of the control block and the deletion of the resource
is thread-safe. The access to the ressource is not thread-safe.
Tony Van Eerd: Forget what you learned in Kindergarten. Stop
sharing.
â–Ș Solution:
â–Ș std::atomic_shared_ptr
â–Ș std::atomic_weak_ptr
Atomic Smart Pointers
Atomic Smart Pointer
3 Reasons
â–Ș Consistency
â–Ș std::shared_ptr is the only non-atomic data type for which atomic
operations exists.
â–Ș Correctness
â–Ș The correct usage of atomic operations is just based on the discipline of
the user. extremly error-prone
std::atomic_store(&sharPtr, localPtr) sharPtr = localPtr
â–Ș Performance
â–Ș std::shared_ptr has to be design for the special use-case.
Atomic Smart Pointer
Atomic Smart Pointers
Atomic smart pointers are part of ISO C++standard.
â–Ș std::atomic_shared_ptr
std::atomic<std::shared_ptr<T>>
â–Ș std::atomic_weak_ptr
std::atomic<std::weak_ptr<T>>
std::future doesn't support composition
â–Ș std::future Improvement Continuation
â–Ș then: execute the next future if the previous one is done
future<int> f1 = async([](){ return 123; });
future<string> f2 = f1.then([](future<int> f){
return to_string(f.get() ); // non-blocking
});
auto myResult = f2.get(); // blocking
std::future Extensions
â–Ș when_all: execute the future if all futures are done
â–Ș when_any: execute the future if one of the futures is done
std::future Extensions
future<int> futures[] = { async([]() { return intResult(125); }),
async([]() { return intResult(456); })};
future<vector<future<int>>> all_f = when_all(begin(futures), end(futures));
vector<future<int>> myResult = all_f.get();
for (auto fut: myResult): fut.get();
future<int> futures[] = {async([]() { return intResult(125); }),
async([]() { return intResult(456); })};
when_any_result<vector<future<int>>> any_f = when_any(begin(futures),
end(futures));
future<int> myResult = any_f.futures[any_f.index];
auto myResult = myResult.get();
std::future Extensions
â–Ș Disadvantages of the extended futures
â–Ș Futures and promises are coupled to std::thread.
â–Ș Where are .then continuations are invoked?
â–Ș Passing futures to .then continuation is too verbose.
std::future f1 = std::async([]{ return 123; });
std::future f2 = f1.then([](std::future f){
return std::to_string(f.get()); }
);
std::future f2 = f1.then(std::to_string);
â–Ș Future blocks in its destructor.
â–Ș Futures und values should be easily composable.
bool f(std::string, double, int);
std::future<std::string> a = /* ... */;
std::future<int> c = /* ... */;
std::future<bool> d2 = when_all(a, 3.14, c).then(f);
// f(a.get(), 3.14, c.get())
C++ has no semaphor latches and barriers
â–Ș Key idea
A thread is waiting at the synchronisation point until the counter
becomes zero.
â–Ș latch is for the one-time use-case
â–Ș count_down_and_wait: decrements the counter until it becomes
zero
â–Ș count_down(n = 0): decrements the counter by n
â–Ș is_ready: checks the counter
â–Ș wait: waits until the counter becomes zero
Latches and Barriers
â–Ș barrier can be reused
â–Ș arrive_and_wait: waits at the synchronisation point
â–Ș arrive_and_drop: removes itself from the sychronisation
mechanism
â–Ș flex_barrier is a reusable and adaptable barrier
â–Ș The constructor gets a callable.
â–Ș The callable will be called in the completion phase.
â–Ș The callable returns a number which stands for the counter in the next
iteration.
â–Ș Can change the value of the counter for each iteration.
Latches and Barriers
Latches and Barriers
void doWork(threadpool* pool) {
latch completion_latch(NUMBER_TASKS);
for (int i = 0; i < NUMBER_TASKS; ++i) {
pool->add_task([&] {
// perform the work
...
completion_latch.count_down();
}));
}
// block until all tasks are done
completion_latch.wait();
}
Coroutines
Coroutines are generalised functions that can be
suspended and resumed while keeping their state.
â–Ș Typical use-case
â–Ș Cooperative Tasks
â–Ș Event loops
â–Ș Infinite data streams
â–Ș Pipelines
Coroutines
A function is a coroutine if it has a co_return, co_await,
co_yield call or if it has a range-based for loop with a co_await
call.
Function Coroutine
invoke func(args) func(args)
return return statement co_return someValue
suspend co_await someAwaitable
co_yield someValue
resume coroutine_handle<>::resume()
Coroutines
generator<int> genForNumbers(int begin, int inc= 1){
for (int i = begin;; i += inc){
co_yield i;
}
}
int main(){
auto numbers = genForNumbers(-10);
for (int i = 1; i <= 20; ++i) std::cout << numbers << " ";
for (auto n: genForNumbers(0,5)) std::cout << n << " ";
}
-10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10
0 5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 . . . .
Coroutines
Blocking
Acceptor accept{443};
while (true){
Socket so = accept.accept(); // block
auto req = so.read(); // block
auto resp = handleRequest(req);
so.write(resp); // block
}
Waiting
Acceptor accept{443};
while (true){
Socket so = co_await accept.accept();
auto req = co_await so.read();
auto resp = handleRequest(req);
co_await so.write(resp);
}
Transactional Memory is the idea of transactions from the
data base theory applied to software.
â–Ș A transaction has the ACID properties without Durability
atomic{
statement1;
statement2;
statement3;
}
â–Ș Atomicity: all or no statement will be performed
â–Ș Consistency: the system is always in a consistent state
â–Ș Isolation: a transaction runs total isolation
â–Ș Durability: the result of a transaction will be stored
Transactional Memory
â–Ș Transactions
â–Ș build a total order
â–Ș feel like a global lock
â–Ș Optimistic approach lock
â–Ș Workflow
A transaction stores its initial state.
The transaction will be performed without synchronisation.
The runtime experiences a violation to the initial state.
The transaction will be performend once more.
Transactional Memory
Retry Rollback
â–Ș Two forms
â–Ș synchronized blocks
â–Ș relaxed transaction
â–Ș are not transaction in the pure sense
can have transaction-unsafe code
â–Ș atomic blocks
â–Ș atomic blocks
â–Ș are available in three variations
can only execute transaction-safe code
Transactional Memory
Transactional Memory
int i = 0;
void inc() {
synchronized{
cout << ++i << " ,";
}
}
vector<thread> vecSyn(10);
for(auto& t: vecSyn)
t = thread([]{ for(int n = 0; n < 10; ++n) inc(); });
Transactional Memory
void inc() {
synchronized{
std::cout << ++i << " ,";
this_thead::sleep_for(1ns);
}
}
vector<thread> vecSyn(10), vecUnsyn(10);
for(auto& t: vecSyn)
t= thread[]{ for(int n = 0; n < 10; ++n) inc(); });
for(auto& t: vecUnsyn)
t= thread[]{ for(int n = 0; n < 10; ++n) cout << ++i << " ,"; });
Task Blocks
Fork-join parallelism with task blocks.
Task Blocks
template <typename Func>
int traverse(node& n, Func && f){
int left = 0, right = 0;
define_task_block(
[&](task_block& tb){
if (n.left) tb.run([&]{ left = traverse(*n.left, f); });
if (n.right) tb.run([&]{ right = traverse(*n.right, f); });
}
);
return f(n) + left + right;
}
â–Ș define_task_block
â–Ș tasks can be perfomed
â–Ș tasks will be synchronised at the end of the task block
â–Ș run: starts a task
Concurrency and Parallelism in C++
Multithreading Concurrency and Parallelism
Concurrency and Parallelism in C++
Proposals
â–Ș Atomic smart pointers: N4162 (2014)
â–Ș std::future extensions: N4107 (2014) and P070r1 (2017)
â–Ș Latches and barriers: P0666R0 (2017)
â–Ș Coroutines: N4723 (2018)
â–Ș Transactional memory: N4265 (2014)
â–Ș Task blocks: N4411 (2015)
â–Ș Executors: P0761 (2018)
â–Ș Concurrent unordered associative containers: N3732 (2013)
â–Ș Concurrent Queue: P0260r0 (2016)
â–Ș Pipelines: N3534 (2013)
â–Ș Distributed counters: P0261r1 (2016)
â–Ș Jthread P0660R2 (2018)
Rainer Grimm
Training, Coaching, and
Technology Consulting
www.ModernesCpp.de
Blogs
www.grimm-jaud.de [De]
www.ModernesCpp.com [En]

Weitere Àhnliche Inhalte

Was ist angesagt?

ĐĐœŃ‚ĐŸĐœ БоĐșĐžĐœĐ”Đ”ĐČ, Writing good std::future&lt; C++ >
ĐĐœŃ‚ĐŸĐœ БоĐșĐžĐœĐ”Đ”ĐČ, Writing good std::future&lt; C++ >ĐĐœŃ‚ĐŸĐœ БоĐșĐžĐœĐ”Đ”ĐČ, Writing good std::future&lt; C++ >
ĐĐœŃ‚ĐŸĐœ БоĐșĐžĐœĐ”Đ”ĐČ, Writing good std::future&lt; C++ >Sergey Platonov
 
C++ How I learned to stop worrying and love metaprogramming
C++ How I learned to stop worrying and love metaprogrammingC++ How I learned to stop worrying and love metaprogramming
C++ How I learned to stop worrying and love metaprogrammingcppfrug
 
C++ăźè©±ïŒˆæœŹćœ“ă«ă‚ăŁăŸæ€–ă„è©±ïŒ‰
C++ăźè©±ïŒˆæœŹćœ“ă«ă‚ăŁăŸæ€–ă„è©±ïŒ‰C++ăźè©±ïŒˆæœŹćœ“ă«ă‚ăŁăŸæ€–ă„è©±ïŒ‰
C++ăźè©±ïŒˆæœŹćœ“ă«ă‚ăŁăŸæ€–ă„è©±ïŒ‰Yuki Tamura
 
Ownership System in Rust
Ownership System in RustOwnership System in Rust
Ownership System in RustChih-Hsuan Kuo
 
ĐĐœŃ‚ĐŸĐœ БоĐșĐžĐœĐ”Đ”ĐČ, Reflection in C++Next
ĐĐœŃ‚ĐŸĐœ БоĐșĐžĐœĐ”Đ”ĐČ,  Reflection in C++NextĐĐœŃ‚ĐŸĐœ БоĐșĐžĐœĐ”Đ”ĐČ,  Reflection in C++Next
ĐĐœŃ‚ĐŸĐœ БоĐșĐžĐœĐ”Đ”ĐČ, Reflection in C++NextSergey Platonov
 
OOP for Hardware Verification--Demystified!
OOP for Hardware Verification--Demystified! OOP for Hardware Verification--Demystified!
OOP for Hardware Verification--Demystified! DVClub
 
Protocol handler in Gecko
Protocol handler in GeckoProtocol handler in Gecko
Protocol handler in GeckoChih-Hsuan Kuo
 
What's New in C++ 11/14?
What's New in C++ 11/14?What's New in C++ 11/14?
What's New in C++ 11/14?Dina Goldshtein
 
Multithreading done right
Multithreading done rightMultithreading done right
Multithreading done rightPlatonov Sergey
 
C++ aptitude
C++ aptitudeC++ aptitude
C++ aptitudechetan_p211
 
ĐšĐŸĐČĐ°Ń€ĐœŃ‹ĐžÌ† code type ITGM #9
ĐšĐŸĐČĐ°Ń€ĐœŃ‹ĐžÌ† code type ITGM #9ĐšĐŸĐČĐ°Ń€ĐœŃ‹ĐžÌ† code type ITGM #9
ĐšĐŸĐČĐ°Ń€ĐœŃ‹ĐžÌ† code type ITGM #9Andrey Zakharevich
 
Advance C++notes
Advance C++notesAdvance C++notes
Advance C++notesRajiv Gupta
 
Other Approaches (Concurrency)
Other Approaches (Concurrency)Other Approaches (Concurrency)
Other Approaches (Concurrency)Sri Prasanna
 
C++11 Multithreading - Futures
C++11 Multithreading - FuturesC++11 Multithreading - Futures
C++11 Multithreading - FuturesGlobalLogic Ukraine
 
Promises generatorscallbacks
Promises generatorscallbacksPromises generatorscallbacks
Promises generatorscallbacksMike Frey
 
The mighty js_function
The mighty js_functionThe mighty js_function
The mighty js_functiontimotheeg
 
LLVM Backend たçŽč介
LLVM Backend たçŽč介LLVM Backend たçŽč介
LLVM Backend たçŽč介Akira Maruoka
 
TMPA-2017: Predicate Abstraction Based Configurable Method for Data Race Dete...
TMPA-2017: Predicate Abstraction Based Configurable Method for Data Race Dete...TMPA-2017: Predicate Abstraction Based Configurable Method for Data Race Dete...
TMPA-2017: Predicate Abstraction Based Configurable Method for Data Race Dete...Iosif Itkin
 

Was ist angesagt? (20)

ĐĐœŃ‚ĐŸĐœ БоĐșĐžĐœĐ”Đ”ĐČ, Writing good std::future&lt; C++ >
ĐĐœŃ‚ĐŸĐœ БоĐșĐžĐœĐ”Đ”ĐČ, Writing good std::future&lt; C++ >ĐĐœŃ‚ĐŸĐœ БоĐșĐžĐœĐ”Đ”ĐČ, Writing good std::future&lt; C++ >
ĐĐœŃ‚ĐŸĐœ БоĐșĐžĐœĐ”Đ”ĐČ, Writing good std::future&lt; C++ >
 
Qt Rest Server
Qt Rest ServerQt Rest Server
Qt Rest Server
 
C++ How I learned to stop worrying and love metaprogramming
C++ How I learned to stop worrying and love metaprogrammingC++ How I learned to stop worrying and love metaprogramming
C++ How I learned to stop worrying and love metaprogramming
 
C++ăźè©±ïŒˆæœŹćœ“ă«ă‚ăŁăŸæ€–ă„è©±ïŒ‰
C++ăźè©±ïŒˆæœŹćœ“ă«ă‚ăŁăŸæ€–ă„è©±ïŒ‰C++ăźè©±ïŒˆæœŹćœ“ă«ă‚ăŁăŸæ€–ă„è©±ïŒ‰
C++ăźè©±ïŒˆæœŹćœ“ă«ă‚ăŁăŸæ€–ă„è©±ïŒ‰
 
Ownership System in Rust
Ownership System in RustOwnership System in Rust
Ownership System in Rust
 
ĐĐœŃ‚ĐŸĐœ БоĐșĐžĐœĐ”Đ”ĐČ, Reflection in C++Next
ĐĐœŃ‚ĐŸĐœ БоĐșĐžĐœĐ”Đ”ĐČ,  Reflection in C++NextĐĐœŃ‚ĐŸĐœ БоĐșĐžĐœĐ”Đ”ĐČ,  Reflection in C++Next
ĐĐœŃ‚ĐŸĐœ БоĐșĐžĐœĐ”Đ”ĐČ, Reflection in C++Next
 
OOP for Hardware Verification--Demystified!
OOP for Hardware Verification--Demystified! OOP for Hardware Verification--Demystified!
OOP for Hardware Verification--Demystified!
 
Protocol handler in Gecko
Protocol handler in GeckoProtocol handler in Gecko
Protocol handler in Gecko
 
What's New in C++ 11/14?
What's New in C++ 11/14?What's New in C++ 11/14?
What's New in C++ 11/14?
 
Multithreading done right
Multithreading done rightMultithreading done right
Multithreading done right
 
C++ aptitude
C++ aptitudeC++ aptitude
C++ aptitude
 
ĐšĐŸĐČĐ°Ń€ĐœŃ‹ĐžÌ† code type ITGM #9
ĐšĐŸĐČĐ°Ń€ĐœŃ‹ĐžÌ† code type ITGM #9ĐšĐŸĐČĐ°Ń€ĐœŃ‹ĐžÌ† code type ITGM #9
ĐšĐŸĐČĐ°Ń€ĐœŃ‹ĐžÌ† code type ITGM #9
 
Advance C++notes
Advance C++notesAdvance C++notes
Advance C++notes
 
Other Approaches (Concurrency)
Other Approaches (Concurrency)Other Approaches (Concurrency)
Other Approaches (Concurrency)
 
C++11 - STL Additions
C++11 - STL AdditionsC++11 - STL Additions
C++11 - STL Additions
 
C++11 Multithreading - Futures
C++11 Multithreading - FuturesC++11 Multithreading - Futures
C++11 Multithreading - Futures
 
Promises generatorscallbacks
Promises generatorscallbacksPromises generatorscallbacks
Promises generatorscallbacks
 
The mighty js_function
The mighty js_functionThe mighty js_function
The mighty js_function
 
LLVM Backend たçŽč介
LLVM Backend たçŽč介LLVM Backend たçŽč介
LLVM Backend たçŽč介
 
TMPA-2017: Predicate Abstraction Based Configurable Method for Data Race Dete...
TMPA-2017: Predicate Abstraction Based Configurable Method for Data Race Dete...TMPA-2017: Predicate Abstraction Based Configurable Method for Data Race Dete...
TMPA-2017: Predicate Abstraction Based Configurable Method for Data Race Dete...
 

Ähnlich wie C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 - Rainer Grimm

Giorgio zoppi cpp11concurrency
Giorgio zoppi cpp11concurrencyGiorgio zoppi cpp11concurrency
Giorgio zoppi cpp11concurrencyGiorgio Zoppi
 
ceph::errorator<> throw/catch-free, compile time-checked exceptions for seast...
ceph::errorator<> throw/catch-free, compile time-checked exceptions for seast...ceph::errorator<> throw/catch-free, compile time-checked exceptions for seast...
ceph::errorator<> throw/catch-free, compile time-checked exceptions for seast...ScyllaDB
 
C++11: Rvalue References, Move Semantics, Perfect Forwarding
C++11: Rvalue References, Move Semantics, Perfect ForwardingC++11: Rvalue References, Move Semantics, Perfect Forwarding
C++11: Rvalue References, Move Semantics, Perfect ForwardingFrancesco Casalegno
 
[grcpp] Refactoring for testability c++
[grcpp] Refactoring for testability c++[grcpp] Refactoring for testability c++
[grcpp] Refactoring for testability c++Dimitrios Platis
 
GPU Programming on CPU - Using C++AMP
GPU Programming on CPU - Using C++AMPGPU Programming on CPU - Using C++AMP
GPU Programming on CPU - Using C++AMPMiller Lee
 
Refactoring for testability c++
Refactoring for testability c++Refactoring for testability c++
Refactoring for testability c++Dimitrios Platis
 
Loom and concurrency latest
Loom and concurrency latestLoom and concurrency latest
Loom and concurrency latestSrinivasan Raghavan
 
Core Java Programming Language (JSE) : Chapter IV - Expressions and Flow Cont...
Core Java Programming Language (JSE) : Chapter IV - Expressions and Flow Cont...Core Java Programming Language (JSE) : Chapter IV - Expressions and Flow Cont...
Core Java Programming Language (JSE) : Chapter IV - Expressions and Flow Cont...WebStackAcademy
 
Handling Exceptions In C &amp; C++ [Part B] Ver 2
Handling Exceptions In C &amp; C++ [Part B] Ver 2Handling Exceptions In C &amp; C++ [Part B] Ver 2
Handling Exceptions In C &amp; C++ [Part B] Ver 2ppd1961
 
Jdk 7 4-forkjoin
Jdk 7 4-forkjoinJdk 7 4-forkjoin
Jdk 7 4-forkjoinknight1128
 
Object oriented programming system with C++
Object oriented programming system with C++Object oriented programming system with C++
Object oriented programming system with C++msharshitha03s
 
Actor Concurrency
Actor ConcurrencyActor Concurrency
Actor ConcurrencyAlex Miller
 
Deuce STM - CMP'09
Deuce STM - CMP'09Deuce STM - CMP'09
Deuce STM - CMP'09Guy Korland
 
Advanced patterns in asynchronous programming
Advanced patterns in asynchronous programmingAdvanced patterns in asynchronous programming
Advanced patterns in asynchronous programmingMichael Arenzon
 
Threaded Programming
Threaded ProgrammingThreaded Programming
Threaded ProgrammingSri Prasanna
 
C aptitude questions
C aptitude questionsC aptitude questions
C aptitude questionsSrikanth
 
C - aptitude3
C - aptitude3C - aptitude3
C - aptitude3Srikanth
 
äžș什äčˆ rust-lang ćžćŒ•æˆ‘ïŒŸ
äžș什äčˆ rust-lang ćžćŒ•æˆ‘ïŒŸäžș什äčˆ rust-lang ćžćŒ•æˆ‘ïŒŸ
äžș什äčˆ rust-lang ćžćŒ•æˆ‘ïŒŸć‹‡æ”© è”–
 

Ähnlich wie C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 - Rainer Grimm (20)

Giorgio zoppi cpp11concurrency
Giorgio zoppi cpp11concurrencyGiorgio zoppi cpp11concurrency
Giorgio zoppi cpp11concurrency
 
ceph::errorator<> throw/catch-free, compile time-checked exceptions for seast...
ceph::errorator<> throw/catch-free, compile time-checked exceptions for seast...ceph::errorator<> throw/catch-free, compile time-checked exceptions for seast...
ceph::errorator<> throw/catch-free, compile time-checked exceptions for seast...
 
C++11: Rvalue References, Move Semantics, Perfect Forwarding
C++11: Rvalue References, Move Semantics, Perfect ForwardingC++11: Rvalue References, Move Semantics, Perfect Forwarding
C++11: Rvalue References, Move Semantics, Perfect Forwarding
 
[grcpp] Refactoring for testability c++
[grcpp] Refactoring for testability c++[grcpp] Refactoring for testability c++
[grcpp] Refactoring for testability c++
 
GPU Programming on CPU - Using C++AMP
GPU Programming on CPU - Using C++AMPGPU Programming on CPU - Using C++AMP
GPU Programming on CPU - Using C++AMP
 
Refactoring for testability c++
Refactoring for testability c++Refactoring for testability c++
Refactoring for testability c++
 
Loom and concurrency latest
Loom and concurrency latestLoom and concurrency latest
Loom and concurrency latest
 
Core Java Programming Language (JSE) : Chapter IV - Expressions and Flow Cont...
Core Java Programming Language (JSE) : Chapter IV - Expressions and Flow Cont...Core Java Programming Language (JSE) : Chapter IV - Expressions and Flow Cont...
Core Java Programming Language (JSE) : Chapter IV - Expressions and Flow Cont...
 
Handling Exceptions In C &amp; C++ [Part B] Ver 2
Handling Exceptions In C &amp; C++ [Part B] Ver 2Handling Exceptions In C &amp; C++ [Part B] Ver 2
Handling Exceptions In C &amp; C++ [Part B] Ver 2
 
Threads
ThreadsThreads
Threads
 
Jdk 7 4-forkjoin
Jdk 7 4-forkjoinJdk 7 4-forkjoin
Jdk 7 4-forkjoin
 
Object oriented programming system with C++
Object oriented programming system with C++Object oriented programming system with C++
Object oriented programming system with C++
 
Actor Concurrency
Actor ConcurrencyActor Concurrency
Actor Concurrency
 
Deuce STM - CMP'09
Deuce STM - CMP'09Deuce STM - CMP'09
Deuce STM - CMP'09
 
Advanced patterns in asynchronous programming
Advanced patterns in asynchronous programmingAdvanced patterns in asynchronous programming
Advanced patterns in asynchronous programming
 
Async fun
Async funAsync fun
Async fun
 
Threaded Programming
Threaded ProgrammingThreaded Programming
Threaded Programming
 
C aptitude questions
C aptitude questionsC aptitude questions
C aptitude questions
 
C - aptitude3
C - aptitude3C - aptitude3
C - aptitude3
 
äžș什äčˆ rust-lang ćžćŒ•æˆ‘ïŒŸ
äžș什äčˆ rust-lang ćžćŒ•æˆ‘ïŒŸäžș什äčˆ rust-lang ćžćŒ•æˆ‘ïŒŸ
äžș什äčˆ rust-lang ćžćŒ•æˆ‘ïŒŸ
 

Mehr von corehard_by

C++ CoreHard Autumn 2018. ĐĄĐŸĐ·ĐŽĐ°ĐœĐžĐ” паĐșĐ”Ń‚ĐŸĐČ ĐŽĐ»Ń ĐŸŃ‚Đșрытых Đ±ĐžĐ±Đ»ĐžĐŸŃ‚Đ”Đș чДрДз conan...
C++ CoreHard Autumn 2018. ĐĄĐŸĐ·ĐŽĐ°ĐœĐžĐ” паĐșĐ”Ń‚ĐŸĐČ ĐŽĐ»Ń ĐŸŃ‚Đșрытых Đ±ĐžĐ±Đ»ĐžĐŸŃ‚Đ”Đș чДрДз conan...C++ CoreHard Autumn 2018. ĐĄĐŸĐ·ĐŽĐ°ĐœĐžĐ” паĐșĐ”Ń‚ĐŸĐČ ĐŽĐ»Ń ĐŸŃ‚Đșрытых Đ±ĐžĐ±Đ»ĐžĐŸŃ‚Đ”Đș чДрДз conan...
C++ CoreHard Autumn 2018. ĐĄĐŸĐ·ĐŽĐ°ĐœĐžĐ” паĐșĐ”Ń‚ĐŸĐČ ĐŽĐ»Ń ĐŸŃ‚Đșрытых Đ±ĐžĐ±Đ»ĐžĐŸŃ‚Đ”Đș чДрДз conan...corehard_by
 
C++ CoreHard Autumn 2018. Đ§Ń‚ĐŸ ĐŽĐŸĐ»Đ¶Đ”Đœ Đ·ĐœĐ°Ń‚ŃŒ ĐșажЎыĐč C++ ĐżŃ€ĐŸĐłŃ€Đ°ĐŒĐŒĐžŃŃ‚ ОлО КаĐș ĐżŃ€ĐŸ...
C++ CoreHard Autumn 2018. Đ§Ń‚ĐŸ ĐŽĐŸĐ»Đ¶Đ”Đœ Đ·ĐœĐ°Ń‚ŃŒ ĐșажЎыĐč C++ ĐżŃ€ĐŸĐłŃ€Đ°ĐŒĐŒĐžŃŃ‚ ОлО КаĐș ĐżŃ€ĐŸ...C++ CoreHard Autumn 2018. Đ§Ń‚ĐŸ ĐŽĐŸĐ»Đ¶Đ”Đœ Đ·ĐœĐ°Ń‚ŃŒ ĐșажЎыĐč C++ ĐżŃ€ĐŸĐłŃ€Đ°ĐŒĐŒĐžŃŃ‚ ОлО КаĐș ĐżŃ€ĐŸ...
C++ CoreHard Autumn 2018. Đ§Ń‚ĐŸ ĐŽĐŸĐ»Đ¶Đ”Đœ Đ·ĐœĐ°Ń‚ŃŒ ĐșажЎыĐč C++ ĐżŃ€ĐŸĐłŃ€Đ°ĐŒĐŒĐžŃŃ‚ ОлО КаĐș ĐżŃ€ĐŸ...corehard_by
 
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - ЕĐČĐłĐ”ĐœĐžĐč ĐžŃ…ĐŸŃ‚ĐœĐžĐșĐŸĐČ
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - ЕĐČĐłĐ”ĐœĐžĐč ĐžŃ…ĐŸŃ‚ĐœĐžĐșĐŸĐČC++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - ЕĐČĐłĐ”ĐœĐžĐč ĐžŃ…ĐŸŃ‚ĐœĐžĐșĐŸĐČ
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - ЕĐČĐłĐ”ĐœĐžĐč ĐžŃ…ĐŸŃ‚ĐœĐžĐșĐŸĐČcorehard_by
 
C++ CoreHard Autumn 2018. Đ—ĐœĐ°Đč сĐČĐŸĐ” "Đ¶Đ”Đ»Đ”Đ·ĐŸ": ĐžĐ”Ń€Đ°Ń€Ń…ĐžŃ ĐżĐ°ĐŒŃŃ‚Đž - АлДĐșŃĐ°ĐœĐŽŃ€ ĐąĐžŃ‚ĐŸĐČ
C++ CoreHard Autumn 2018. Đ—ĐœĐ°Đč сĐČĐŸĐ” "Đ¶Đ”Đ»Đ”Đ·ĐŸ": ĐžĐ”Ń€Đ°Ń€Ń…ĐžŃ ĐżĐ°ĐŒŃŃ‚Đž - АлДĐșŃĐ°ĐœĐŽŃ€ ĐąĐžŃ‚ĐŸĐČC++ CoreHard Autumn 2018. Đ—ĐœĐ°Đč сĐČĐŸĐ” "Đ¶Đ”Đ»Đ”Đ·ĐŸ": ĐžĐ”Ń€Đ°Ń€Ń…ĐžŃ ĐżĐ°ĐŒŃŃ‚Đž - АлДĐșŃĐ°ĐœĐŽŃ€ ĐąĐžŃ‚ĐŸĐČ
C++ CoreHard Autumn 2018. Đ—ĐœĐ°Đč сĐČĐŸĐ” "Đ¶Đ”Đ»Đ”Đ·ĐŸ": ĐžĐ”Ń€Đ°Ń€Ń…ĐžŃ ĐżĐ°ĐŒŃŃ‚Đž - АлДĐșŃĐ°ĐœĐŽŃ€ ĐąĐžŃ‚ĐŸĐČcorehard_by
 
C++ CoreHard Autumn 2018. Đ˜ĐœŃ„ĐŸŃ€ĐŒĐ°Ń†ĐžĐŸĐœĐœĐ°Ń Đ±Đ”Đ·ĐŸĐżĐ°ŃĐœĐŸŃŃ‚ŃŒ Đž Ń€Đ°Đ·Ń€Đ°Đ±ĐŸŃ‚ĐșĐ° ПО - ЕĐČĐłĐ”Đœ...
C++ CoreHard Autumn 2018. Đ˜ĐœŃ„ĐŸŃ€ĐŒĐ°Ń†ĐžĐŸĐœĐœĐ°Ń Đ±Đ”Đ·ĐŸĐżĐ°ŃĐœĐŸŃŃ‚ŃŒ Đž Ń€Đ°Đ·Ń€Đ°Đ±ĐŸŃ‚ĐșĐ° ПО - ЕĐČĐłĐ”Đœ...C++ CoreHard Autumn 2018. Đ˜ĐœŃ„ĐŸŃ€ĐŒĐ°Ń†ĐžĐŸĐœĐœĐ°Ń Đ±Đ”Đ·ĐŸĐżĐ°ŃĐœĐŸŃŃ‚ŃŒ Đž Ń€Đ°Đ·Ń€Đ°Đ±ĐŸŃ‚ĐșĐ° ПО - ЕĐČĐłĐ”Đœ...
C++ CoreHard Autumn 2018. Đ˜ĐœŃ„ĐŸŃ€ĐŒĐ°Ń†ĐžĐŸĐœĐœĐ°Ń Đ±Đ”Đ·ĐŸĐżĐ°ŃĐœĐŸŃŃ‚ŃŒ Đž Ń€Đ°Đ·Ń€Đ°Đ±ĐŸŃ‚ĐșĐ° ПО - ЕĐČĐłĐ”Đœ...corehard_by
 
C++ CoreHard Autumn 2018. Đ—Đ°ĐłĐ»ŃĐŽŃ‹ĐČĐ°Đ”ĐŒ ĐżĐŸĐŽ ĐșĐ°ĐżĐŸŃ‚ Â«ĐŸĐŸŃŃĐŸĐČ ĐżĐŸ C++» - Đ˜Đ»ŃŒŃ КОшĐșĐŸĐČ
C++ CoreHard Autumn 2018. Đ—Đ°ĐłĐ»ŃĐŽŃ‹ĐČĐ°Đ”ĐŒ ĐżĐŸĐŽ ĐșĐ°ĐżĐŸŃ‚ Â«ĐŸĐŸŃŃĐŸĐČ ĐżĐŸ C++» - Đ˜Đ»ŃŒŃ КОшĐșĐŸĐČC++ CoreHard Autumn 2018. Đ—Đ°ĐłĐ»ŃĐŽŃ‹ĐČĐ°Đ”ĐŒ ĐżĐŸĐŽ ĐșĐ°ĐżĐŸŃ‚ Â«ĐŸĐŸŃŃĐŸĐČ ĐżĐŸ C++» - Đ˜Đ»ŃŒŃ КОшĐșĐŸĐČ
C++ CoreHard Autumn 2018. Đ—Đ°ĐłĐ»ŃĐŽŃ‹ĐČĐ°Đ”ĐŒ ĐżĐŸĐŽ ĐșĐ°ĐżĐŸŃ‚ Â«ĐŸĐŸŃŃĐŸĐČ ĐżĐŸ C++» - Đ˜Đ»ŃŒŃ КОшĐșĐŸĐČcorehard_by
 
C++ CoreHard Autumn 2018. УсĐșĐŸŃ€Đ”ĐœĐžĐ” ŃĐ±ĐŸŃ€ĐșĐž C++ ĐżŃ€ĐŸĐ”ĐșŃ‚ĐŸĐČ, ŃĐżĐŸŃĐŸĐ±Ń‹ Đž ĐżĐŸŃĐ»Đ”ĐŽŃŃ‚ĐČĐž...
C++ CoreHard Autumn 2018. УсĐșĐŸŃ€Đ”ĐœĐžĐ” ŃĐ±ĐŸŃ€ĐșĐž C++ ĐżŃ€ĐŸĐ”ĐșŃ‚ĐŸĐČ, ŃĐżĐŸŃĐŸĐ±Ń‹ Đž ĐżĐŸŃĐ»Đ”ĐŽŃŃ‚ĐČĐž...C++ CoreHard Autumn 2018. УсĐșĐŸŃ€Đ”ĐœĐžĐ” ŃĐ±ĐŸŃ€ĐșĐž C++ ĐżŃ€ĐŸĐ”ĐșŃ‚ĐŸĐČ, ŃĐżĐŸŃĐŸĐ±Ń‹ Đž ĐżĐŸŃĐ»Đ”ĐŽŃŃ‚ĐČĐž...
C++ CoreHard Autumn 2018. УсĐșĐŸŃ€Đ”ĐœĐžĐ” ŃĐ±ĐŸŃ€ĐșĐž C++ ĐżŃ€ĐŸĐ”ĐșŃ‚ĐŸĐČ, ŃĐżĐŸŃĐŸĐ±Ń‹ Đž ĐżĐŸŃĐ»Đ”ĐŽŃŃ‚ĐČĐž...corehard_by
 
C++ CoreHard Autumn 2018. ĐœĐ”Ń‚Đ°Đșлассы: ĐČĐŸĐżĐ»ĐŸŃ‰Đ°Đ”ĐŒ ĐŒĐ”Ń‡Ń‚Ń‹ ĐČ Ń€Đ”Đ°Đ»ŃŒĐœĐŸŃŃ‚ŃŒ - ХДргДĐč ĐĄ...
C++ CoreHard Autumn 2018. ĐœĐ”Ń‚Đ°Đșлассы: ĐČĐŸĐżĐ»ĐŸŃ‰Đ°Đ”ĐŒ ĐŒĐ”Ń‡Ń‚Ń‹ ĐČ Ń€Đ”Đ°Đ»ŃŒĐœĐŸŃŃ‚ŃŒ - ХДргДĐč ĐĄ...C++ CoreHard Autumn 2018. ĐœĐ”Ń‚Đ°Đșлассы: ĐČĐŸĐżĐ»ĐŸŃ‰Đ°Đ”ĐŒ ĐŒĐ”Ń‡Ń‚Ń‹ ĐČ Ń€Đ”Đ°Đ»ŃŒĐœĐŸŃŃ‚ŃŒ - ХДргДĐč ĐĄ...
C++ CoreHard Autumn 2018. ĐœĐ”Ń‚Đ°Đșлассы: ĐČĐŸĐżĐ»ĐŸŃ‰Đ°Đ”ĐŒ ĐŒĐ”Ń‡Ń‚Ń‹ ĐČ Ń€Đ”Đ°Đ»ŃŒĐœĐŸŃŃ‚ŃŒ - ХДргДĐč ĐĄ...corehard_by
 
C++ CoreHard Autumn 2018. Đ§Ń‚ĐŸ ĐœĐ” ŃƒĐŒĐ”Đ”Ń‚ ĐŸĐżŃ‚ĐžĐŒĐžĐ·ĐžŃ€ĐŸĐČать ĐșĐŸĐŒĐżĐžĐ»ŃŃ‚ĐŸŃ€ - АлДĐșŃĐ°ĐœĐŽŃ€ ...
C++ CoreHard Autumn 2018. Đ§Ń‚ĐŸ ĐœĐ” ŃƒĐŒĐ”Đ”Ń‚ ĐŸĐżŃ‚ĐžĐŒĐžĐ·ĐžŃ€ĐŸĐČать ĐșĐŸĐŒĐżĐžĐ»ŃŃ‚ĐŸŃ€ - АлДĐșŃĐ°ĐœĐŽŃ€ ...C++ CoreHard Autumn 2018. Đ§Ń‚ĐŸ ĐœĐ” ŃƒĐŒĐ”Đ”Ń‚ ĐŸĐżŃ‚ĐžĐŒĐžĐ·ĐžŃ€ĐŸĐČать ĐșĐŸĐŒĐżĐžĐ»ŃŃ‚ĐŸŃ€ - АлДĐșŃĐ°ĐœĐŽŃ€ ...
C++ CoreHard Autumn 2018. Đ§Ń‚ĐŸ ĐœĐ” ŃƒĐŒĐ”Đ”Ń‚ ĐŸĐżŃ‚ĐžĐŒĐžĐ·ĐžŃ€ĐŸĐČать ĐșĐŸĐŒĐżĐžĐ»ŃŃ‚ĐŸŃ€ - АлДĐșŃĐ°ĐœĐŽŃ€ ...corehard_by
 
C++ CoreHard Autumn 2018. ĐšĐŸĐŽĐŸĐłĐ”ĐœĐ”Ń€Đ°Ń†ĐžŃ C++ ĐșŃ€ĐŸŃŃĐżĐ»Đ°Ń‚Ń„ĐŸŃ€ĐŒĐ”ĐœĐœĐŸ. ĐŸŃ€ĐŸĐŽĐŸĐ»Đ¶Đ”ĐœĐžĐ” - ...
C++ CoreHard Autumn 2018. ĐšĐŸĐŽĐŸĐłĐ”ĐœĐ”Ń€Đ°Ń†ĐžŃ C++ ĐșŃ€ĐŸŃŃĐżĐ»Đ°Ń‚Ń„ĐŸŃ€ĐŒĐ”ĐœĐœĐŸ. ĐŸŃ€ĐŸĐŽĐŸĐ»Đ¶Đ”ĐœĐžĐ” - ...C++ CoreHard Autumn 2018. ĐšĐŸĐŽĐŸĐłĐ”ĐœĐ”Ń€Đ°Ń†ĐžŃ C++ ĐșŃ€ĐŸŃŃĐżĐ»Đ°Ń‚Ń„ĐŸŃ€ĐŒĐ”ĐœĐœĐŸ. ĐŸŃ€ĐŸĐŽĐŸĐ»Đ¶Đ”ĐœĐžĐ” - ...
C++ CoreHard Autumn 2018. ĐšĐŸĐŽĐŸĐłĐ”ĐœĐ”Ń€Đ°Ń†ĐžŃ C++ ĐșŃ€ĐŸŃŃĐżĐ»Đ°Ń‚Ń„ĐŸŃ€ĐŒĐ”ĐœĐœĐŸ. ĐŸŃ€ĐŸĐŽĐŸĐ»Đ¶Đ”ĐœĐžĐ” - ...corehard_by
 
C++ CoreHard Autumn 2018. ĐžĐ±Ń€Đ°Đ±ĐŸŃ‚ĐșĐ° спОсĐșĐŸĐČ ĐœĐ° C++ ĐČ Ń„ŃƒĐœĐșŃ†ĐžĐŸĐœĐ°Đ»ŃŒĐœĐŸĐŒ стОлД - В...
C++ CoreHard Autumn 2018. ĐžĐ±Ń€Đ°Đ±ĐŸŃ‚ĐșĐ° спОсĐșĐŸĐČ ĐœĐ° C++ ĐČ Ń„ŃƒĐœĐșŃ†ĐžĐŸĐœĐ°Đ»ŃŒĐœĐŸĐŒ стОлД - В...C++ CoreHard Autumn 2018. ĐžĐ±Ń€Đ°Đ±ĐŸŃ‚ĐșĐ° спОсĐșĐŸĐČ ĐœĐ° C++ ĐČ Ń„ŃƒĐœĐșŃ†ĐžĐŸĐœĐ°Đ»ŃŒĐœĐŸĐŒ стОлД - В...
C++ CoreHard Autumn 2018. ĐžĐ±Ń€Đ°Đ±ĐŸŃ‚ĐșĐ° спОсĐșĐŸĐČ ĐœĐ° C++ ĐČ Ń„ŃƒĐœĐșŃ†ĐžĐŸĐœĐ°Đ»ŃŒĐœĐŸĐŒ стОлД - В...corehard_by
 
C++ Corehard Autumn 2018. ĐžĐ±ŃƒŃ‡Đ°Đ”ĐŒ ĐœĐ° Python, ĐżŃ€ĐžĐŒĐ”ĐœŃĐ”ĐŒ ĐœĐ° C++ - ПаĐČДл Đ€ĐžĐ»ĐŸĐœĐŸĐČ
C++ Corehard Autumn 2018. ĐžĐ±ŃƒŃ‡Đ°Đ”ĐŒ ĐœĐ° Python, ĐżŃ€ĐžĐŒĐ”ĐœŃĐ”ĐŒ ĐœĐ° C++ - ПаĐČДл Đ€ĐžĐ»ĐŸĐœĐŸĐČC++ Corehard Autumn 2018. ĐžĐ±ŃƒŃ‡Đ°Đ”ĐŒ ĐœĐ° Python, ĐżŃ€ĐžĐŒĐ”ĐœŃĐ”ĐŒ ĐœĐ° C++ - ПаĐČДл Đ€ĐžĐ»ĐŸĐœĐŸĐČ
C++ Corehard Autumn 2018. ĐžĐ±ŃƒŃ‡Đ°Đ”ĐŒ ĐœĐ° Python, ĐżŃ€ĐžĐŒĐ”ĐœŃĐ”ĐŒ ĐœĐ° C++ - ПаĐČДл Đ€ĐžĐ»ĐŸĐœĐŸĐČcorehard_by
 
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukić
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan ČukićC++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukić
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukićcorehard_by
 
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakova
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia KazakovaC++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakova
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakovacorehard_by
 
C++ CoreHard Autumn 2018. ĐŸĐŸĐ»Đ”Đ·ĐœŃ‹Đč constexpr - ĐĐœŃ‚ĐŸĐœ ĐŸĐŸĐ»ŃƒŃ…ĐžĐœ
C++ CoreHard Autumn 2018. ĐŸĐŸĐ»Đ”Đ·ĐœŃ‹Đč constexpr - ĐĐœŃ‚ĐŸĐœ ĐŸĐŸĐ»ŃƒŃ…ĐžĐœC++ CoreHard Autumn 2018. ĐŸĐŸĐ»Đ”Đ·ĐœŃ‹Đč constexpr - ĐĐœŃ‚ĐŸĐœ ĐŸĐŸĐ»ŃƒŃ…ĐžĐœ
C++ CoreHard Autumn 2018. ĐŸĐŸĐ»Đ”Đ·ĐœŃ‹Đč constexpr - ĐĐœŃ‚ĐŸĐœ ĐŸĐŸĐ»ŃƒŃ…ĐžĐœcorehard_by
 
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...corehard_by
 
ИсĐșĐ»ŃŽŃ‡ĐžŃ‚Đ”Đ»ŃŒĐœĐ°Ń ĐŒĐŸĐŽĐ”Đ»ŃŒ ĐżĐ°ĐŒŃŃ‚Đž. АлДĐșсДĐč ĐąĐșĐ°Ń‡Đ”ĐœĐșĐŸ ➠ CoreHard Autumn 2019
ИсĐșĐ»ŃŽŃ‡ĐžŃ‚Đ”Đ»ŃŒĐœĐ°Ń ĐŒĐŸĐŽĐ”Đ»ŃŒ ĐżĐ°ĐŒŃŃ‚Đž. АлДĐșсДĐč ĐąĐșĐ°Ń‡Đ”ĐœĐșĐŸ ➠ CoreHard Autumn 2019ИсĐșĐ»ŃŽŃ‡ĐžŃ‚Đ”Đ»ŃŒĐœĐ°Ń ĐŒĐŸĐŽĐ”Đ»ŃŒ ĐżĐ°ĐŒŃŃ‚Đž. АлДĐșсДĐč ĐąĐșĐ°Ń‡Đ”ĐœĐșĐŸ ➠ CoreHard Autumn 2019
ИсĐșĐ»ŃŽŃ‡ĐžŃ‚Đ”Đ»ŃŒĐœĐ°Ń ĐŒĐŸĐŽĐ”Đ»ŃŒ ĐżĐ°ĐŒŃŃ‚Đž. АлДĐșсДĐč ĐąĐșĐ°Ń‡Đ”ĐœĐșĐŸ ➠ CoreHard Autumn 2019corehard_by
 
КаĐș ĐżĐŸĐŒĐŸŃ‡ŃŒ Đž ĐșĐ°Đș ĐżĐŸĐŒĐ”ŃˆĐ°Ń‚ŃŒ ĐșĐŸĐŒĐżĐžĐ»ŃŃ‚ĐŸŃ€Ńƒ. ĐĐœĐŽŃ€Đ”Đč ОлДĐčĐœĐžĐșĐŸĐČ âž  CoreHard Autumn 2019
КаĐș ĐżĐŸĐŒĐŸŃ‡ŃŒ Đž ĐșĐ°Đș ĐżĐŸĐŒĐ”ŃˆĐ°Ń‚ŃŒ ĐșĐŸĐŒĐżĐžĐ»ŃŃ‚ĐŸŃ€Ńƒ. ĐĐœĐŽŃ€Đ”Đč ОлДĐčĐœĐžĐșĐŸĐČ âž   CoreHard Autumn 2019КаĐș ĐżĐŸĐŒĐŸŃ‡ŃŒ Đž ĐșĐ°Đș ĐżĐŸĐŒĐ”ŃˆĐ°Ń‚ŃŒ ĐșĐŸĐŒĐżĐžĐ»ŃŃ‚ĐŸŃ€Ńƒ. ĐĐœĐŽŃ€Đ”Đč ОлДĐčĐœĐžĐșĐŸĐČ âž   CoreHard Autumn 2019
КаĐș ĐżĐŸĐŒĐŸŃ‡ŃŒ Đž ĐșĐ°Đș ĐżĐŸĐŒĐ”ŃˆĐ°Ń‚ŃŒ ĐșĐŸĐŒĐżĐžĐ»ŃŃ‚ĐŸŃ€Ńƒ. ĐĐœĐŽŃ€Đ”Đč ОлДĐčĐœĐžĐșĐŸĐČ âž  CoreHard Autumn 2019corehard_by
 
АĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžĐ·ĐžŃ€ŃƒĐč ŃŃ‚ĐŸ. КОрОлл ĐąĐžŃ…ĐŸĐœĐŸĐČ âž  CoreHard Autumn 2019
АĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžĐ·ĐžŃ€ŃƒĐč ŃŃ‚ĐŸ. КОрОлл ĐąĐžŃ…ĐŸĐœĐŸĐČ âž   CoreHard Autumn 2019АĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžĐ·ĐžŃ€ŃƒĐč ŃŃ‚ĐŸ. КОрОлл ĐąĐžŃ…ĐŸĐœĐŸĐČ âž   CoreHard Autumn 2019
АĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžĐ·ĐžŃ€ŃƒĐč ŃŃ‚ĐŸ. КОрОлл ĐąĐžŃ…ĐŸĐœĐŸĐČ âž  CoreHard Autumn 2019corehard_by
 
ĐĄŃ‚Đ°Ń‚ĐžŃ‡ĐœŃ‹Đč SQL ĐČ ĐĄ++14. ЕĐČĐłĐ”ĐœĐžĐč Đ—Đ°Ń…Đ°Ń€ĐŸĐČ âž  CoreHard Autumn 2019
ĐĄŃ‚Đ°Ń‚ĐžŃ‡ĐœŃ‹Đč SQL ĐČ ĐĄ++14. ЕĐČĐłĐ”ĐœĐžĐč Đ—Đ°Ń…Đ°Ń€ĐŸĐČ âž   CoreHard Autumn 2019ĐĄŃ‚Đ°Ń‚ĐžŃ‡ĐœŃ‹Đč SQL ĐČ ĐĄ++14. ЕĐČĐłĐ”ĐœĐžĐč Đ—Đ°Ń…Đ°Ń€ĐŸĐČ âž   CoreHard Autumn 2019
ĐĄŃ‚Đ°Ń‚ĐžŃ‡ĐœŃ‹Đč SQL ĐČ ĐĄ++14. ЕĐČĐłĐ”ĐœĐžĐč Đ—Đ°Ń…Đ°Ń€ĐŸĐČ âž  CoreHard Autumn 2019corehard_by
 

Mehr von corehard_by (20)

C++ CoreHard Autumn 2018. ĐĄĐŸĐ·ĐŽĐ°ĐœĐžĐ” паĐșĐ”Ń‚ĐŸĐČ ĐŽĐ»Ń ĐŸŃ‚Đșрытых Đ±ĐžĐ±Đ»ĐžĐŸŃ‚Đ”Đș чДрДз conan...
C++ CoreHard Autumn 2018. ĐĄĐŸĐ·ĐŽĐ°ĐœĐžĐ” паĐșĐ”Ń‚ĐŸĐČ ĐŽĐ»Ń ĐŸŃ‚Đșрытых Đ±ĐžĐ±Đ»ĐžĐŸŃ‚Đ”Đș чДрДз conan...C++ CoreHard Autumn 2018. ĐĄĐŸĐ·ĐŽĐ°ĐœĐžĐ” паĐșĐ”Ń‚ĐŸĐČ ĐŽĐ»Ń ĐŸŃ‚Đșрытых Đ±ĐžĐ±Đ»ĐžĐŸŃ‚Đ”Đș чДрДз conan...
C++ CoreHard Autumn 2018. ĐĄĐŸĐ·ĐŽĐ°ĐœĐžĐ” паĐșĐ”Ń‚ĐŸĐČ ĐŽĐ»Ń ĐŸŃ‚Đșрытых Đ±ĐžĐ±Đ»ĐžĐŸŃ‚Đ”Đș чДрДз conan...
 
C++ CoreHard Autumn 2018. Đ§Ń‚ĐŸ ĐŽĐŸĐ»Đ¶Đ”Đœ Đ·ĐœĐ°Ń‚ŃŒ ĐșажЎыĐč C++ ĐżŃ€ĐŸĐłŃ€Đ°ĐŒĐŒĐžŃŃ‚ ОлО КаĐș ĐżŃ€ĐŸ...
C++ CoreHard Autumn 2018. Đ§Ń‚ĐŸ ĐŽĐŸĐ»Đ¶Đ”Đœ Đ·ĐœĐ°Ń‚ŃŒ ĐșажЎыĐč C++ ĐżŃ€ĐŸĐłŃ€Đ°ĐŒĐŒĐžŃŃ‚ ОлО КаĐș ĐżŃ€ĐŸ...C++ CoreHard Autumn 2018. Đ§Ń‚ĐŸ ĐŽĐŸĐ»Đ¶Đ”Đœ Đ·ĐœĐ°Ń‚ŃŒ ĐșажЎыĐč C++ ĐżŃ€ĐŸĐłŃ€Đ°ĐŒĐŒĐžŃŃ‚ ОлО КаĐș ĐżŃ€ĐŸ...
C++ CoreHard Autumn 2018. Đ§Ń‚ĐŸ ĐŽĐŸĐ»Đ¶Đ”Đœ Đ·ĐœĐ°Ń‚ŃŒ ĐșажЎыĐč C++ ĐżŃ€ĐŸĐłŃ€Đ°ĐŒĐŒĐžŃŃ‚ ОлО КаĐș ĐżŃ€ĐŸ...
 
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - ЕĐČĐłĐ”ĐœĐžĐč ĐžŃ…ĐŸŃ‚ĐœĐžĐșĐŸĐČ
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - ЕĐČĐłĐ”ĐœĐžĐč ĐžŃ…ĐŸŃ‚ĐœĐžĐșĐŸĐČC++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - ЕĐČĐłĐ”ĐœĐžĐč ĐžŃ…ĐŸŃ‚ĐœĐžĐșĐŸĐČ
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - ЕĐČĐłĐ”ĐœĐžĐč ĐžŃ…ĐŸŃ‚ĐœĐžĐșĐŸĐČ
 
C++ CoreHard Autumn 2018. Đ—ĐœĐ°Đč сĐČĐŸĐ” "Đ¶Đ”Đ»Đ”Đ·ĐŸ": ĐžĐ”Ń€Đ°Ń€Ń…ĐžŃ ĐżĐ°ĐŒŃŃ‚Đž - АлДĐșŃĐ°ĐœĐŽŃ€ ĐąĐžŃ‚ĐŸĐČ
C++ CoreHard Autumn 2018. Đ—ĐœĐ°Đč сĐČĐŸĐ” "Đ¶Đ”Đ»Đ”Đ·ĐŸ": ĐžĐ”Ń€Đ°Ń€Ń…ĐžŃ ĐżĐ°ĐŒŃŃ‚Đž - АлДĐșŃĐ°ĐœĐŽŃ€ ĐąĐžŃ‚ĐŸĐČC++ CoreHard Autumn 2018. Đ—ĐœĐ°Đč сĐČĐŸĐ” "Đ¶Đ”Đ»Đ”Đ·ĐŸ": ĐžĐ”Ń€Đ°Ń€Ń…ĐžŃ ĐżĐ°ĐŒŃŃ‚Đž - АлДĐșŃĐ°ĐœĐŽŃ€ ĐąĐžŃ‚ĐŸĐČ
C++ CoreHard Autumn 2018. Đ—ĐœĐ°Đč сĐČĐŸĐ” "Đ¶Đ”Đ»Đ”Đ·ĐŸ": ĐžĐ”Ń€Đ°Ń€Ń…ĐžŃ ĐżĐ°ĐŒŃŃ‚Đž - АлДĐșŃĐ°ĐœĐŽŃ€ ĐąĐžŃ‚ĐŸĐČ
 
C++ CoreHard Autumn 2018. Đ˜ĐœŃ„ĐŸŃ€ĐŒĐ°Ń†ĐžĐŸĐœĐœĐ°Ń Đ±Đ”Đ·ĐŸĐżĐ°ŃĐœĐŸŃŃ‚ŃŒ Đž Ń€Đ°Đ·Ń€Đ°Đ±ĐŸŃ‚ĐșĐ° ПО - ЕĐČĐłĐ”Đœ...
C++ CoreHard Autumn 2018. Đ˜ĐœŃ„ĐŸŃ€ĐŒĐ°Ń†ĐžĐŸĐœĐœĐ°Ń Đ±Đ”Đ·ĐŸĐżĐ°ŃĐœĐŸŃŃ‚ŃŒ Đž Ń€Đ°Đ·Ń€Đ°Đ±ĐŸŃ‚ĐșĐ° ПО - ЕĐČĐłĐ”Đœ...C++ CoreHard Autumn 2018. Đ˜ĐœŃ„ĐŸŃ€ĐŒĐ°Ń†ĐžĐŸĐœĐœĐ°Ń Đ±Đ”Đ·ĐŸĐżĐ°ŃĐœĐŸŃŃ‚ŃŒ Đž Ń€Đ°Đ·Ń€Đ°Đ±ĐŸŃ‚ĐșĐ° ПО - ЕĐČĐłĐ”Đœ...
C++ CoreHard Autumn 2018. Đ˜ĐœŃ„ĐŸŃ€ĐŒĐ°Ń†ĐžĐŸĐœĐœĐ°Ń Đ±Đ”Đ·ĐŸĐżĐ°ŃĐœĐŸŃŃ‚ŃŒ Đž Ń€Đ°Đ·Ń€Đ°Đ±ĐŸŃ‚ĐșĐ° ПО - ЕĐČĐłĐ”Đœ...
 
C++ CoreHard Autumn 2018. Đ—Đ°ĐłĐ»ŃĐŽŃ‹ĐČĐ°Đ”ĐŒ ĐżĐŸĐŽ ĐșĐ°ĐżĐŸŃ‚ Â«ĐŸĐŸŃŃĐŸĐČ ĐżĐŸ C++» - Đ˜Đ»ŃŒŃ КОшĐșĐŸĐČ
C++ CoreHard Autumn 2018. Đ—Đ°ĐłĐ»ŃĐŽŃ‹ĐČĐ°Đ”ĐŒ ĐżĐŸĐŽ ĐșĐ°ĐżĐŸŃ‚ Â«ĐŸĐŸŃŃĐŸĐČ ĐżĐŸ C++» - Đ˜Đ»ŃŒŃ КОшĐșĐŸĐČC++ CoreHard Autumn 2018. Đ—Đ°ĐłĐ»ŃĐŽŃ‹ĐČĐ°Đ”ĐŒ ĐżĐŸĐŽ ĐșĐ°ĐżĐŸŃ‚ Â«ĐŸĐŸŃŃĐŸĐČ ĐżĐŸ C++» - Đ˜Đ»ŃŒŃ КОшĐșĐŸĐČ
C++ CoreHard Autumn 2018. Đ—Đ°ĐłĐ»ŃĐŽŃ‹ĐČĐ°Đ”ĐŒ ĐżĐŸĐŽ ĐșĐ°ĐżĐŸŃ‚ Â«ĐŸĐŸŃŃĐŸĐČ ĐżĐŸ C++» - Đ˜Đ»ŃŒŃ КОшĐșĐŸĐČ
 
C++ CoreHard Autumn 2018. УсĐșĐŸŃ€Đ”ĐœĐžĐ” ŃĐ±ĐŸŃ€ĐșĐž C++ ĐżŃ€ĐŸĐ”ĐșŃ‚ĐŸĐČ, ŃĐżĐŸŃĐŸĐ±Ń‹ Đž ĐżĐŸŃĐ»Đ”ĐŽŃŃ‚ĐČĐž...
C++ CoreHard Autumn 2018. УсĐșĐŸŃ€Đ”ĐœĐžĐ” ŃĐ±ĐŸŃ€ĐșĐž C++ ĐżŃ€ĐŸĐ”ĐșŃ‚ĐŸĐČ, ŃĐżĐŸŃĐŸĐ±Ń‹ Đž ĐżĐŸŃĐ»Đ”ĐŽŃŃ‚ĐČĐž...C++ CoreHard Autumn 2018. УсĐșĐŸŃ€Đ”ĐœĐžĐ” ŃĐ±ĐŸŃ€ĐșĐž C++ ĐżŃ€ĐŸĐ”ĐșŃ‚ĐŸĐČ, ŃĐżĐŸŃĐŸĐ±Ń‹ Đž ĐżĐŸŃĐ»Đ”ĐŽŃŃ‚ĐČĐž...
C++ CoreHard Autumn 2018. УсĐșĐŸŃ€Đ”ĐœĐžĐ” ŃĐ±ĐŸŃ€ĐșĐž C++ ĐżŃ€ĐŸĐ”ĐșŃ‚ĐŸĐČ, ŃĐżĐŸŃĐŸĐ±Ń‹ Đž ĐżĐŸŃĐ»Đ”ĐŽŃŃ‚ĐČĐž...
 
C++ CoreHard Autumn 2018. ĐœĐ”Ń‚Đ°Đșлассы: ĐČĐŸĐżĐ»ĐŸŃ‰Đ°Đ”ĐŒ ĐŒĐ”Ń‡Ń‚Ń‹ ĐČ Ń€Đ”Đ°Đ»ŃŒĐœĐŸŃŃ‚ŃŒ - ХДргДĐč ĐĄ...
C++ CoreHard Autumn 2018. ĐœĐ”Ń‚Đ°Đșлассы: ĐČĐŸĐżĐ»ĐŸŃ‰Đ°Đ”ĐŒ ĐŒĐ”Ń‡Ń‚Ń‹ ĐČ Ń€Đ”Đ°Đ»ŃŒĐœĐŸŃŃ‚ŃŒ - ХДргДĐč ĐĄ...C++ CoreHard Autumn 2018. ĐœĐ”Ń‚Đ°Đșлассы: ĐČĐŸĐżĐ»ĐŸŃ‰Đ°Đ”ĐŒ ĐŒĐ”Ń‡Ń‚Ń‹ ĐČ Ń€Đ”Đ°Đ»ŃŒĐœĐŸŃŃ‚ŃŒ - ХДргДĐč ĐĄ...
C++ CoreHard Autumn 2018. ĐœĐ”Ń‚Đ°Đșлассы: ĐČĐŸĐżĐ»ĐŸŃ‰Đ°Đ”ĐŒ ĐŒĐ”Ń‡Ń‚Ń‹ ĐČ Ń€Đ”Đ°Đ»ŃŒĐœĐŸŃŃ‚ŃŒ - ХДргДĐč ĐĄ...
 
C++ CoreHard Autumn 2018. Đ§Ń‚ĐŸ ĐœĐ” ŃƒĐŒĐ”Đ”Ń‚ ĐŸĐżŃ‚ĐžĐŒĐžĐ·ĐžŃ€ĐŸĐČать ĐșĐŸĐŒĐżĐžĐ»ŃŃ‚ĐŸŃ€ - АлДĐșŃĐ°ĐœĐŽŃ€ ...
C++ CoreHard Autumn 2018. Đ§Ń‚ĐŸ ĐœĐ” ŃƒĐŒĐ”Đ”Ń‚ ĐŸĐżŃ‚ĐžĐŒĐžĐ·ĐžŃ€ĐŸĐČать ĐșĐŸĐŒĐżĐžĐ»ŃŃ‚ĐŸŃ€ - АлДĐșŃĐ°ĐœĐŽŃ€ ...C++ CoreHard Autumn 2018. Đ§Ń‚ĐŸ ĐœĐ” ŃƒĐŒĐ”Đ”Ń‚ ĐŸĐżŃ‚ĐžĐŒĐžĐ·ĐžŃ€ĐŸĐČать ĐșĐŸĐŒĐżĐžĐ»ŃŃ‚ĐŸŃ€ - АлДĐșŃĐ°ĐœĐŽŃ€ ...
C++ CoreHard Autumn 2018. Đ§Ń‚ĐŸ ĐœĐ” ŃƒĐŒĐ”Đ”Ń‚ ĐŸĐżŃ‚ĐžĐŒĐžĐ·ĐžŃ€ĐŸĐČать ĐșĐŸĐŒĐżĐžĐ»ŃŃ‚ĐŸŃ€ - АлДĐșŃĐ°ĐœĐŽŃ€ ...
 
C++ CoreHard Autumn 2018. ĐšĐŸĐŽĐŸĐłĐ”ĐœĐ”Ń€Đ°Ń†ĐžŃ C++ ĐșŃ€ĐŸŃŃĐżĐ»Đ°Ń‚Ń„ĐŸŃ€ĐŒĐ”ĐœĐœĐŸ. ĐŸŃ€ĐŸĐŽĐŸĐ»Đ¶Đ”ĐœĐžĐ” - ...
C++ CoreHard Autumn 2018. ĐšĐŸĐŽĐŸĐłĐ”ĐœĐ”Ń€Đ°Ń†ĐžŃ C++ ĐșŃ€ĐŸŃŃĐżĐ»Đ°Ń‚Ń„ĐŸŃ€ĐŒĐ”ĐœĐœĐŸ. ĐŸŃ€ĐŸĐŽĐŸĐ»Đ¶Đ”ĐœĐžĐ” - ...C++ CoreHard Autumn 2018. ĐšĐŸĐŽĐŸĐłĐ”ĐœĐ”Ń€Đ°Ń†ĐžŃ C++ ĐșŃ€ĐŸŃŃĐżĐ»Đ°Ń‚Ń„ĐŸŃ€ĐŒĐ”ĐœĐœĐŸ. ĐŸŃ€ĐŸĐŽĐŸĐ»Đ¶Đ”ĐœĐžĐ” - ...
C++ CoreHard Autumn 2018. ĐšĐŸĐŽĐŸĐłĐ”ĐœĐ”Ń€Đ°Ń†ĐžŃ C++ ĐșŃ€ĐŸŃŃĐżĐ»Đ°Ń‚Ń„ĐŸŃ€ĐŒĐ”ĐœĐœĐŸ. ĐŸŃ€ĐŸĐŽĐŸĐ»Đ¶Đ”ĐœĐžĐ” - ...
 
C++ CoreHard Autumn 2018. ĐžĐ±Ń€Đ°Đ±ĐŸŃ‚ĐșĐ° спОсĐșĐŸĐČ ĐœĐ° C++ ĐČ Ń„ŃƒĐœĐșŃ†ĐžĐŸĐœĐ°Đ»ŃŒĐœĐŸĐŒ стОлД - В...
C++ CoreHard Autumn 2018. ĐžĐ±Ń€Đ°Đ±ĐŸŃ‚ĐșĐ° спОсĐșĐŸĐČ ĐœĐ° C++ ĐČ Ń„ŃƒĐœĐșŃ†ĐžĐŸĐœĐ°Đ»ŃŒĐœĐŸĐŒ стОлД - В...C++ CoreHard Autumn 2018. ĐžĐ±Ń€Đ°Đ±ĐŸŃ‚ĐșĐ° спОсĐșĐŸĐČ ĐœĐ° C++ ĐČ Ń„ŃƒĐœĐșŃ†ĐžĐŸĐœĐ°Đ»ŃŒĐœĐŸĐŒ стОлД - В...
C++ CoreHard Autumn 2018. ĐžĐ±Ń€Đ°Đ±ĐŸŃ‚ĐșĐ° спОсĐșĐŸĐČ ĐœĐ° C++ ĐČ Ń„ŃƒĐœĐșŃ†ĐžĐŸĐœĐ°Đ»ŃŒĐœĐŸĐŒ стОлД - В...
 
C++ Corehard Autumn 2018. ĐžĐ±ŃƒŃ‡Đ°Đ”ĐŒ ĐœĐ° Python, ĐżŃ€ĐžĐŒĐ”ĐœŃĐ”ĐŒ ĐœĐ° C++ - ПаĐČДл Đ€ĐžĐ»ĐŸĐœĐŸĐČ
C++ Corehard Autumn 2018. ĐžĐ±ŃƒŃ‡Đ°Đ”ĐŒ ĐœĐ° Python, ĐżŃ€ĐžĐŒĐ”ĐœŃĐ”ĐŒ ĐœĐ° C++ - ПаĐČДл Đ€ĐžĐ»ĐŸĐœĐŸĐČC++ Corehard Autumn 2018. ĐžĐ±ŃƒŃ‡Đ°Đ”ĐŒ ĐœĐ° Python, ĐżŃ€ĐžĐŒĐ”ĐœŃĐ”ĐŒ ĐœĐ° C++ - ПаĐČДл Đ€ĐžĐ»ĐŸĐœĐŸĐČ
C++ Corehard Autumn 2018. ĐžĐ±ŃƒŃ‡Đ°Đ”ĐŒ ĐœĐ° Python, ĐżŃ€ĐžĐŒĐ”ĐœŃĐ”ĐŒ ĐœĐ° C++ - ПаĐČДл Đ€ĐžĐ»ĐŸĐœĐŸĐČ
 
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukić
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan ČukićC++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukić
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukić
 
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakova
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia KazakovaC++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakova
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakova
 
C++ CoreHard Autumn 2018. ĐŸĐŸĐ»Đ”Đ·ĐœŃ‹Đč constexpr - ĐĐœŃ‚ĐŸĐœ ĐŸĐŸĐ»ŃƒŃ…ĐžĐœ
C++ CoreHard Autumn 2018. ĐŸĐŸĐ»Đ”Đ·ĐœŃ‹Đč constexpr - ĐĐœŃ‚ĐŸĐœ ĐŸĐŸĐ»ŃƒŃ…ĐžĐœC++ CoreHard Autumn 2018. ĐŸĐŸĐ»Đ”Đ·ĐœŃ‹Đč constexpr - ĐĐœŃ‚ĐŸĐœ ĐŸĐŸĐ»ŃƒŃ…ĐžĐœ
C++ CoreHard Autumn 2018. ĐŸĐŸĐ»Đ”Đ·ĐœŃ‹Đč constexpr - ĐĐœŃ‚ĐŸĐœ ĐŸĐŸĐ»ŃƒŃ…ĐžĐœ
 
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...
 
ИсĐșĐ»ŃŽŃ‡ĐžŃ‚Đ”Đ»ŃŒĐœĐ°Ń ĐŒĐŸĐŽĐ”Đ»ŃŒ ĐżĐ°ĐŒŃŃ‚Đž. АлДĐșсДĐč ĐąĐșĐ°Ń‡Đ”ĐœĐșĐŸ ➠ CoreHard Autumn 2019
ИсĐșĐ»ŃŽŃ‡ĐžŃ‚Đ”Đ»ŃŒĐœĐ°Ń ĐŒĐŸĐŽĐ”Đ»ŃŒ ĐżĐ°ĐŒŃŃ‚Đž. АлДĐșсДĐč ĐąĐșĐ°Ń‡Đ”ĐœĐșĐŸ ➠ CoreHard Autumn 2019ИсĐșĐ»ŃŽŃ‡ĐžŃ‚Đ”Đ»ŃŒĐœĐ°Ń ĐŒĐŸĐŽĐ”Đ»ŃŒ ĐżĐ°ĐŒŃŃ‚Đž. АлДĐșсДĐč ĐąĐșĐ°Ń‡Đ”ĐœĐșĐŸ ➠ CoreHard Autumn 2019
ИсĐșĐ»ŃŽŃ‡ĐžŃ‚Đ”Đ»ŃŒĐœĐ°Ń ĐŒĐŸĐŽĐ”Đ»ŃŒ ĐżĐ°ĐŒŃŃ‚Đž. АлДĐșсДĐč ĐąĐșĐ°Ń‡Đ”ĐœĐșĐŸ ➠ CoreHard Autumn 2019
 
КаĐș ĐżĐŸĐŒĐŸŃ‡ŃŒ Đž ĐșĐ°Đș ĐżĐŸĐŒĐ”ŃˆĐ°Ń‚ŃŒ ĐșĐŸĐŒĐżĐžĐ»ŃŃ‚ĐŸŃ€Ńƒ. ĐĐœĐŽŃ€Đ”Đč ОлДĐčĐœĐžĐșĐŸĐČ âž  CoreHard Autumn 2019
КаĐș ĐżĐŸĐŒĐŸŃ‡ŃŒ Đž ĐșĐ°Đș ĐżĐŸĐŒĐ”ŃˆĐ°Ń‚ŃŒ ĐșĐŸĐŒĐżĐžĐ»ŃŃ‚ĐŸŃ€Ńƒ. ĐĐœĐŽŃ€Đ”Đč ОлДĐčĐœĐžĐșĐŸĐČ âž   CoreHard Autumn 2019КаĐș ĐżĐŸĐŒĐŸŃ‡ŃŒ Đž ĐșĐ°Đș ĐżĐŸĐŒĐ”ŃˆĐ°Ń‚ŃŒ ĐșĐŸĐŒĐżĐžĐ»ŃŃ‚ĐŸŃ€Ńƒ. ĐĐœĐŽŃ€Đ”Đč ОлДĐčĐœĐžĐșĐŸĐČ âž   CoreHard Autumn 2019
КаĐș ĐżĐŸĐŒĐŸŃ‡ŃŒ Đž ĐșĐ°Đș ĐżĐŸĐŒĐ”ŃˆĐ°Ń‚ŃŒ ĐșĐŸĐŒĐżĐžĐ»ŃŃ‚ĐŸŃ€Ńƒ. ĐĐœĐŽŃ€Đ”Đč ОлДĐčĐœĐžĐșĐŸĐČ âž  CoreHard Autumn 2019
 
АĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžĐ·ĐžŃ€ŃƒĐč ŃŃ‚ĐŸ. КОрОлл ĐąĐžŃ…ĐŸĐœĐŸĐČ âž  CoreHard Autumn 2019
АĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžĐ·ĐžŃ€ŃƒĐč ŃŃ‚ĐŸ. КОрОлл ĐąĐžŃ…ĐŸĐœĐŸĐČ âž   CoreHard Autumn 2019АĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžĐ·ĐžŃ€ŃƒĐč ŃŃ‚ĐŸ. КОрОлл ĐąĐžŃ…ĐŸĐœĐŸĐČ âž   CoreHard Autumn 2019
АĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžĐ·ĐžŃ€ŃƒĐč ŃŃ‚ĐŸ. КОрОлл ĐąĐžŃ…ĐŸĐœĐŸĐČ âž  CoreHard Autumn 2019
 
ĐĄŃ‚Đ°Ń‚ĐžŃ‡ĐœŃ‹Đč SQL ĐČ ĐĄ++14. ЕĐČĐłĐ”ĐœĐžĐč Đ—Đ°Ń…Đ°Ń€ĐŸĐČ âž  CoreHard Autumn 2019
ĐĄŃ‚Đ°Ń‚ĐžŃ‡ĐœŃ‹Đč SQL ĐČ ĐĄ++14. ЕĐČĐłĐ”ĐœĐžĐč Đ—Đ°Ń…Đ°Ń€ĐŸĐČ âž   CoreHard Autumn 2019ĐĄŃ‚Đ°Ń‚ĐžŃ‡ĐœŃ‹Đč SQL ĐČ ĐĄ++14. ЕĐČĐłĐ”ĐœĐžĐč Đ—Đ°Ń…Đ°Ń€ĐŸĐČ âž   CoreHard Autumn 2019
ĐĄŃ‚Đ°Ń‚ĐžŃ‡ĐœŃ‹Đč SQL ĐČ ĐĄ++14. ЕĐČĐłĐ”ĐœĐžĐč Đ—Đ°Ń…Đ°Ń€ĐŸĐČ âž  CoreHard Autumn 2019
 

KĂŒrzlich hochgeladen

ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesrafiqahmad00786416
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native ApplicationsWSO2
 
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdfRising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdfOrbitshub
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MIND CTI
 
Mcleodganj Call Girls đŸ„° 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls đŸ„° 8617370543 Service Offer VIP Hot ModelMcleodganj Call Girls đŸ„° 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls đŸ„° 8617370543 Service Offer VIP Hot ModelDeepika Singh
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxRustici Software
 
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Orbitshub
 
Exploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusExploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusZilliz
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherRemote DBA Services
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingEdi Saputra
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...apidays
 
WSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering DevelopersWSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering DevelopersWSO2
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businesspanagenda
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Victor Rentea
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Jeffrey Haguewood
 
Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)Zilliz
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century educationjfdjdjcjdnsjd
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProduct Anonymous
 
Platformless Horizons for Digital Adaptability
Platformless Horizons for Digital AdaptabilityPlatformless Horizons for Digital Adaptability
Platformless Horizons for Digital AdaptabilityWSO2
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAndrey Devyatkin
 

KĂŒrzlich hochgeladen (20)

ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
 
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdfRising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
Mcleodganj Call Girls đŸ„° 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls đŸ„° 8617370543 Service Offer VIP Hot ModelMcleodganj Call Girls đŸ„° 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls đŸ„° 8617370543 Service Offer VIP Hot Model
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptx
 
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
 
Exploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusExploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with Milvus
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
WSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering DevelopersWSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering Developers
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
 
Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
Platformless Horizons for Digital Adaptability
Platformless Horizons for Digital AdaptabilityPlatformless Horizons for Digital Adaptability
Platformless Horizons for Digital Adaptability
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 

C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 - Rainer Grimm

  • 1. Concurrency and Parallelism with C++17 and C++20/23 Rainer Grimm Training, Coaching and, Technology Consulting www.ModernesCpp.de
  • 4. You can choose the execution policy of an algorithm. â–Ș Execution policies std::execution::seq â–Ș Sequential in one thread std::execution::par â–Ș Parallel std::execution::par_unseq â–Ș Parallel and vectorised SIMD Parallel STL
  • 5. Parallel STL Not vectorised Vectorised const int SIZE = 8; int vec[]={1, 2 , 3, 4, 5, 6, 7, 8}; int res[SIZE] = {0,}; int main(){ for (int i= 0; i < SIZE; ++i){ res[i] = vec[i] + 5; } }
  • 6. using namespace std; vector<int> vec = {1, 2, 3, 4, 5, .... } sort(vec.begin(), vec.end()); // sequential as ever sort(execution::seq, vec.begin(), vec.end()); // sequential sort(execution::par, vec.begin(), vec.end()); // parallel sort(execution::par_unseq, vec.begin(), vec.end()); // par + vec Parallel STL
  • 7. Parallel STL adjacent_difference, adjacent_find, all_of any_of, copy, copy_if, copy_n, count, count_if, equal, exclusive_scan, fill, fill_n, find, find_end, find_first_of, find_if, find_if_not, for_each, for_each_n, generate, generate_n, includes, inclusive_scan, inner_product, inplace_merge, is_heap, is_heap_until, is_partitioned, is_sorted, is_sorted_until, lexicographical_compare, max_element, merge, min_element, minmax_element, mismatch, move, none_of, nth_element, partial_sort, partial_sort_copy, partition, partition_copy, reduce, remove, remove_copy, remove_copy_if, remove_if, replace, replace_copy, replace_copy_if, replace_if, reverse, reverse_copy, rotate, rotate_copy, search, search_n, set_difference, set_intersection, set_symmetric_difference, set_union, sort, stable_partition, stable_sort, swap_ranges, transform, transform_exclusive_scan, transform_inclusive_scan, transform_reduce, uninitialized_copy, uninitialized_copy_n, uninitialized_fill, uninitialized_fill_n, unique, unique_copy
  • 8. Parallel STL std::transform_reduce â–Ș Haskells function map is called std::transform in C++ â–Ș std::transform_reduce std::map_reduce
  • 9. Parallel STL â–Ș Danger of data races or deadlocks The access to numComp has to be atomic. int numComp = 0; vector<int> vec = {1, 3, 8, 9, 10}; sort(execution::par, vec.begin(), vec.end(), [&numComp](int fir, int sec){ numComp++; return fir < sec; } );
  • 11. Executors Executors are the basic building block for execution in C++. â–Ș They fulfil a similar role for execution such as allocators for allocation. An executor consists of a set of rules for a callables: â–Ș Where: run on a internal or external processor â–Ș When: run immediately or later â–Ș How: run on a CPU or GPU
  • 12. Executors â–Ș Using an executor my_executor_type my_executor = ... ; auto future = std::async(my_executor, []{ std::cout << "Hello world " << std::endl; } ); std::for_each(std::execution::par.on(my_executor), data.begin(), data.end(), func); â–Ș Obtaining an executor static_thread_pool pool(4); auto exec = pool.executor(); task1 = long_running_task(exec);
  • 13. Executors An executor provides one or more execution functions for creating a callable. Name Cardinality Direction execute single oneway twoway_execute single twoway then_execute single then bulk_execute bulk oneway bulk_twoway_execute bulk twoway bulk_then_execute bulk then Cardinality: Creation of one execution agent or a group of execution agents. Direction: Directions of the execution.
  • 14. std::jthread Problem: std::thread throws std::terminate in its destructor if still joinable. std::thread t{[]{ std::cout << "New thread"; }}; std::cout << "t.joinable(): " << t.joinable();
  • 15. std::jthread Solution: std::jthread joins automatically at the end of its scope. std::jthread t{[]{ std::cout << "New thread"; }}; std::cout << "t.joinable(): " << t.joinable();
  • 16. std::jthread â–Ș Instances of std::jthread can be interrupted Receiver â–Ș Explicit check: â–Ș is_interrupted: yields, when an interrupt was signalled â–Ș std::condition_variable wait variations with predicate Sender â–Ș interrupt: signals an interrupt (and returns whether an interrupt was signaled before)
  • 17. std::jthread jthread nonInterruptable([]{ int counter{0}; while (counter < 10){ this_thread::sleep_for(0.2s); cerr << "nonInterruptable: " << counter << endl; ++counter; } }); jthread interruptable([](interrupt_token itoken){ int counter{0}; while (counter < 10){ this_thread::sleep_for(0.2s); if (itoken.is_interrupted()) return; cerr << "interruptable: " << counter << endl; ++counter; } }); this_thread::sleep_for(1s); cerr << endl; cerr << "Main thread interrupts both jthreads" << endl; nonInterruptable.interrupt(); interruptable.interrupt(); cout << endl;
  • 19. C++11 has a std::shared_ptr for shared ownership. â–Ș General Rule: â–Ș You should use smart pointers. â–Ș But: â–Ș The managing of the control block and the deletion of the resource is thread-safe. The access to the ressource is not thread-safe. Tony Van Eerd: Forget what you learned in Kindergarten. Stop sharing. â–Ș Solution: â–Ș std::atomic_shared_ptr â–Ș std::atomic_weak_ptr Atomic Smart Pointers
  • 20. Atomic Smart Pointer 3 Reasons â–Ș Consistency â–Ș std::shared_ptr is the only non-atomic data type for which atomic operations exists. â–Ș Correctness â–Ș The correct usage of atomic operations is just based on the discipline of the user. extremly error-prone std::atomic_store(&sharPtr, localPtr) sharPtr = localPtr â–Ș Performance â–Ș std::shared_ptr has to be design for the special use-case.
  • 22. Atomic Smart Pointers Atomic smart pointers are part of ISO C++standard. â–Ș std::atomic_shared_ptr std::atomic<std::shared_ptr<T>> â–Ș std::atomic_weak_ptr std::atomic<std::weak_ptr<T>>
  • 23. std::future doesn't support composition â–Ș std::future Improvement Continuation â–Ș then: execute the next future if the previous one is done future<int> f1 = async([](){ return 123; }); future<string> f2 = f1.then([](future<int> f){ return to_string(f.get() ); // non-blocking }); auto myResult = f2.get(); // blocking std::future Extensions
  • 24. â–Ș when_all: execute the future if all futures are done â–Ș when_any: execute the future if one of the futures is done std::future Extensions future<int> futures[] = { async([]() { return intResult(125); }), async([]() { return intResult(456); })}; future<vector<future<int>>> all_f = when_all(begin(futures), end(futures)); vector<future<int>> myResult = all_f.get(); for (auto fut: myResult): fut.get(); future<int> futures[] = {async([]() { return intResult(125); }), async([]() { return intResult(456); })}; when_any_result<vector<future<int>>> any_f = when_any(begin(futures), end(futures)); future<int> myResult = any_f.futures[any_f.index]; auto myResult = myResult.get();
  • 25. std::future Extensions â–Ș Disadvantages of the extended futures â–Ș Futures and promises are coupled to std::thread. â–Ș Where are .then continuations are invoked? â–Ș Passing futures to .then continuation is too verbose. std::future f1 = std::async([]{ return 123; }); std::future f2 = f1.then([](std::future f){ return std::to_string(f.get()); } ); std::future f2 = f1.then(std::to_string); â–Ș Future blocks in its destructor. â–Ș Futures und values should be easily composable. bool f(std::string, double, int); std::future<std::string> a = /* ... */; std::future<int> c = /* ... */; std::future<bool> d2 = when_all(a, 3.14, c).then(f); // f(a.get(), 3.14, c.get())
  • 26. C++ has no semaphor latches and barriers â–Ș Key idea A thread is waiting at the synchronisation point until the counter becomes zero. â–Ș latch is for the one-time use-case â–Ș count_down_and_wait: decrements the counter until it becomes zero â–Ș count_down(n = 0): decrements the counter by n â–Ș is_ready: checks the counter â–Ș wait: waits until the counter becomes zero Latches and Barriers
  • 27. â–Ș barrier can be reused â–Ș arrive_and_wait: waits at the synchronisation point â–Ș arrive_and_drop: removes itself from the sychronisation mechanism â–Ș flex_barrier is a reusable and adaptable barrier â–Ș The constructor gets a callable. â–Ș The callable will be called in the completion phase. â–Ș The callable returns a number which stands for the counter in the next iteration. â–Ș Can change the value of the counter for each iteration. Latches and Barriers
  • 28. Latches and Barriers void doWork(threadpool* pool) { latch completion_latch(NUMBER_TASKS); for (int i = 0; i < NUMBER_TASKS; ++i) { pool->add_task([&] { // perform the work ... completion_latch.count_down(); })); } // block until all tasks are done completion_latch.wait(); }
  • 29. Coroutines Coroutines are generalised functions that can be suspended and resumed while keeping their state. â–Ș Typical use-case â–Ș Cooperative Tasks â–Ș Event loops â–Ș Infinite data streams â–Ș Pipelines
  • 30. Coroutines A function is a coroutine if it has a co_return, co_await, co_yield call or if it has a range-based for loop with a co_await call. Function Coroutine invoke func(args) func(args) return return statement co_return someValue suspend co_await someAwaitable co_yield someValue resume coroutine_handle<>::resume()
  • 31. Coroutines generator<int> genForNumbers(int begin, int inc= 1){ for (int i = begin;; i += inc){ co_yield i; } } int main(){ auto numbers = genForNumbers(-10); for (int i = 1; i <= 20; ++i) std::cout << numbers << " "; for (auto n: genForNumbers(0,5)) std::cout << n << " "; } -10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10 0 5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 . . . .
  • 32. Coroutines Blocking Acceptor accept{443}; while (true){ Socket so = accept.accept(); // block auto req = so.read(); // block auto resp = handleRequest(req); so.write(resp); // block } Waiting Acceptor accept{443}; while (true){ Socket so = co_await accept.accept(); auto req = co_await so.read(); auto resp = handleRequest(req); co_await so.write(resp); }
  • 33. Transactional Memory is the idea of transactions from the data base theory applied to software. â–Ș A transaction has the ACID properties without Durability atomic{ statement1; statement2; statement3; } â–Ș Atomicity: all or no statement will be performed â–Ș Consistency: the system is always in a consistent state â–Ș Isolation: a transaction runs total isolation â–Ș Durability: the result of a transaction will be stored Transactional Memory
  • 34. â–Ș Transactions â–Ș build a total order â–Ș feel like a global lock â–Ș Optimistic approach lock â–Ș Workflow A transaction stores its initial state. The transaction will be performed without synchronisation. The runtime experiences a violation to the initial state. The transaction will be performend once more. Transactional Memory Retry Rollback
  • 35. â–Ș Two forms â–Ș synchronized blocks â–Ș relaxed transaction â–Ș are not transaction in the pure sense can have transaction-unsafe code â–Ș atomic blocks â–Ș atomic blocks â–Ș are available in three variations can only execute transaction-safe code Transactional Memory
  • 36. Transactional Memory int i = 0; void inc() { synchronized{ cout << ++i << " ,"; } } vector<thread> vecSyn(10); for(auto& t: vecSyn) t = thread([]{ for(int n = 0; n < 10; ++n) inc(); });
  • 37. Transactional Memory void inc() { synchronized{ std::cout << ++i << " ,"; this_thead::sleep_for(1ns); } } vector<thread> vecSyn(10), vecUnsyn(10); for(auto& t: vecSyn) t= thread[]{ for(int n = 0; n < 10; ++n) inc(); }); for(auto& t: vecUnsyn) t= thread[]{ for(int n = 0; n < 10; ++n) cout << ++i << " ,"; });
  • 39. Task Blocks template <typename Func> int traverse(node& n, Func && f){ int left = 0, right = 0; define_task_block( [&](task_block& tb){ if (n.left) tb.run([&]{ left = traverse(*n.left, f); }); if (n.right) tb.run([&]{ right = traverse(*n.right, f); }); } ); return f(n) + left + right; } â–Ș define_task_block â–Ș tasks can be perfomed â–Ș tasks will be synchronised at the end of the task block â–Ș run: starts a task
  • 40. Concurrency and Parallelism in C++ Multithreading Concurrency and Parallelism
  • 42. Proposals â–Ș Atomic smart pointers: N4162 (2014) â–Ș std::future extensions: N4107 (2014) and P070r1 (2017) â–Ș Latches and barriers: P0666R0 (2017) â–Ș Coroutines: N4723 (2018) â–Ș Transactional memory: N4265 (2014) â–Ș Task blocks: N4411 (2015) â–Ș Executors: P0761 (2018) â–Ș Concurrent unordered associative containers: N3732 (2013) â–Ș Concurrent Queue: P0260r0 (2016) â–Ș Pipelines: N3534 (2013) â–Ș Distributed counters: P0261r1 (2016) â–Ș Jthread P0660R2 (2018)
  • 43. Rainer Grimm Training, Coaching, and Technology Consulting www.ModernesCpp.de Blogs www.grimm-jaud.de [De] www.ModernesCpp.com [En]