libcppa
play

libcppa An actor library for C++ with extensible group semantic - PowerPoint PPT Presentation

libcppa An actor library for C++ with extensible group semantic libcppa Dominik Charousset July 2011 Dominik Charousset (HAW Hamburg) libcppa July 2011 1 / 24 Agenda Motivation 1 Concurrency Approaches 2 The Actor Model 3 libcppa 4


  1. libcppa An actor library for C++ with extensible group semantic libcppa Dominik Charousset July 2011 Dominik Charousset (HAW Hamburg) libcppa July 2011 1 / 24

  2. Agenda Motivation 1 Concurrency Approaches 2 The Actor Model 3 libcppa 4 libcppa 5 Architecture Questions & Answers 6 Dominik Charousset (HAW Hamburg) libcppa July 2011 2 / 24

  3. Motivation Herb Sutter: “The Free Lunch Is Over” CPU clock speed stagnates More cores instead of more clock speed http://www.gotw.ca/publications/concurrency-ddj.htm Dominik Charousset (HAW Hamburg) libcppa July 2011 3 / 24

  4. Motivation Herb Sutter: “The Free Lunch Is Over” CPU clock speed stagnates More cores instead of more clock speed ⇒ Single-threaded Software doesn’t benefit from new hardware http://www.gotw.ca/publications/concurrency-ddj.htm Dominik Charousset (HAW Hamburg) libcppa July 2011 3 / 24

  5. Motivation Herb Sutter: “The Free Lunch Is Over” – Consequence “Software has to double the amount of parallelism that it can support every two years.” – Shekhar Y. Borkar (Intel) Dominik Charousset (HAW Hamburg) libcppa July 2011 4 / 24

  6. Motivation Multithreading In C-like Languages A multithreaded environment requires, that each object (in the shared memory ) has to be thread safe Immutable objects are always thread-safe (if initialization is done) Stateful objects need synchronization Dominik Charousset (HAW Hamburg) libcppa July 2011 5 / 24

  7. Motivation Multithreading In C-like Languages A multithreaded environment requires, that each object (in the shared memory ) has to be thread safe Immutable objects are always thread-safe (if initialization is done) Stateful objects need synchronization ⇒ The developer is responsible for thread safety! Errors lead to ... Race conditions Deadlocks/Lifelocks Poor scalability due to queueing (Coarse-Grained Locking) Dominik Charousset (HAW Hamburg) libcppa July 2011 5 / 24

  8. Motivation Multithreading In C-like Languages A multithreaded environment requires, that each object (in the shared memory ) has to be thread safe Immutable objects are always thread-safe (if initialization is done) Stateful objects need synchronization ⇒ The developer is responsible for thread safety! Errors lead to ... Race conditions Deadlocks/Lifelocks Poor scalability due to queueing (Coarse-Grained Locking) “Mutable stateful objects are the new spaghetti code” – Rich Hickey Dominik Charousset (HAW Hamburg) libcppa July 2011 5 / 24

  9. Motivation Multithreading in C-like languages – Example 1 class Subject { private int value; private List<Listener> listeners = ...; public interface Listener { public void stateChanged(int newValue); } public synchronized void addListener(Listener listener) { listeners.add(listener); } public synchronized void setValue(int newValue) { value = newValue; for (Listener l : listeners) { l.stateChanged(newValue); } } } Dominik Charousset (HAW Hamburg) libcppa July 2011 6 / 24

  10. Motivation Multithreading in C-like languages – Example 1 class FooBar { private Subject s; public synchronized void foo() { ... s.addListener(...); ... } public synchronized void bar() { ... } } Dominik Charousset (HAW Hamburg) libcppa July 2011 7 / 24

  11. Motivation Multithreading in C-like languages – Example 1 Thread1 Thread2 Subject s FooBar fb Dominik Charousset (HAW Hamburg) libcppa July 2011 8 / 24

  12. Motivation Multithreading in C-like languages – Example 1 Thread1 Thread2 public void stateChanged(int val) { .... fb.bar(); .... } addListener(li) Subject s Listener li FooBar fb Dominik Charousset (HAW Hamburg) libcppa July 2011 8 / 24

  13. Motivation Multithreading in C-like languages – Example 1 Thread1 Thread2 setValue(...) Subject s Listener li FooBar fb Dominik Charousset (HAW Hamburg) libcppa July 2011 8 / 24

  14. Motivation Multithreading in C-like languages – Example 1 Thread1 Thread2 setValue(...) Subject s stateChanged(...) Listener li foo() FooBar fb Dominik Charousset (HAW Hamburg) libcppa July 2011 8 / 24

  15. Motivation Multithreading in C-like languages – Example 1 Thread1 Thread2 setValue(...) Subject addListener(...) s stateChanged(...) Listener li bar() foo() FooBar fb Dominik Charousset (HAW Hamburg) libcppa July 2011 8 / 24

  16. Motivation Multithreading in C-like languages – Example 1 Programming with locks increases complexity and error-proneness. Libraries (objects) with locks are no longer black boxes The user have to know about implementation details (“which method uses which lock?”) Dominik Charousset (HAW Hamburg) libcppa July 2011 9 / 24

  17. Motivation Multithreading in C-like languages – Example 2 c l a s s Foo { // immutable s t a t i c Foo ∗ ptr ; s t a t i c Foo ∗ i n s t a n c e () { // 1 s t t e s t i f ( ptr == n u l l p t r ) { Lock l ock ; // 2nd t e s t i f ( ptr == n u l l p t r ) ptr = new Foo ; } return ptr ; } // . . . } Adapted from: “C++ and the Perils of Double-Checked Locking” (Meyers & Alexandrescu, 2004) Dominik Charousset (HAW Hamburg) libcppa July 2011 10 / 24

  18. Motivation Multithreading in C-like languages – Example 2 Problem : c l a s s Foo { // immutable s t a t i c Foo ∗ ptr ; “ ptr = new Foo ” is not atomic: s t a t i c Foo ∗ i n s t a n c e () { 1. Allocate memory // 1 s t t e s t 2. Call constructor of Foo i f ( ptr == n u l l p t r ) { 3. Assign memory address to ptr Lock l ock ; // 2nd t e s t i f ( ptr == n u l l p t r ) ptr = new Foo ; } return ptr ; } // . . . } Adapted from: “C++ and the Perils of Double-Checked Locking” (Meyers & Alexandrescu, 2004) Dominik Charousset (HAW Hamburg) libcppa July 2011 10 / 24

  19. Motivation Multithreading in C-like languages – Example 2 Problem : c l a s s Foo { // immutable s t a t i c Foo ∗ ptr ; “ ptr = new Foo ” is not atomic: s t a t i c Foo ∗ i n s t a n c e () { 1. Allocate memory // 1 s t t e s t 2. Call constructor of Foo i f ( ptr == n u l l p t r ) { 3. Assign memory address to ptr Lock l ock ; // 2nd t e s t i f ( ptr == n u l l p t r ) If 3 happens before 2 , a second ptr = new Foo ; thread might deallocate ptr before } the constructor was called return ptr ; } (undefined behavior). // . . . } Adapted from: “C++ and the Perils of Double-Checked Locking” (Meyers & Alexandrescu, 2004) Dominik Charousset (HAW Hamburg) libcppa July 2011 10 / 24

  20. Motivation Multithreading in C-like languages – Example 2 Concurrency with low-level primitives requires a lot of expert knowledge. Seemingly correct code can lead to undefined behavior Almost impossible to verify by testing An implementation can be thread-safe on a uniprocessor machine (“timeslice-based parallelism”) but can lead to race conditions on a multiprocessor machine (true hardware concurrency) Dominik Charousset (HAW Hamburg) libcppa July 2011 11 / 24

  21. Concurrency Approaches Transactional Memory Race condition free shared memory Reads & writes are atomic and transactional “all or nothing” writes Readers don’t interfere writers and vice versa In hardware or software (e.g. Clojure ) Dominik Charousset (HAW Hamburg) libcppa July 2011 12 / 24

  22. Concurrency Approaches Join-Calculus (JoCaml) 1. def fruit(f) & cake(c) = print_endline (fˆ“ ”ˆ c) ; 0 val fruit : string Join.chan = <abstr> val cake : string Join.chan = <abstr> 2. spawn fruit “apple” & cake “pie” 3. spawn fruit “apple” & fruit “lime” & cake “pie” & cake “torte” Join-calculus is a member of the π calculus family Processes communicate (synchronize) via ports Dominik Charousset (HAW Hamburg) libcppa July 2011 13 / 24

  23. Concurrency Approaches Join-Calculus (JoCaml) 1. def fruit(f) & cake(c) = print_endline (fˆ“ ”ˆ c) ; 0 val fruit : string Join.chan = <abstr> val cake : string Join.chan = <abstr> 2. spawn fruit “apple” & cake “pie” 3. spawn fruit “apple” & fruit “lime” & cake “pie” & cake “torte” Join-calculus is a member of the π calculus family Processes communicate (synchronize) via ports Source code example: 1. Define two ports and the guarded process print_endline ... 2. Prints “apple pie” 3. Prints “apple pie”, “lime torte” or “apple torte”, “lime pie” Dominik Charousset (HAW Hamburg) libcppa July 2011 13 / 24

  24. Concurrency Approaches Summary There are basically two approaches: Provide a safe (free of race conditions) shared memory Model concurrent tasks/processes as independent components, communicating via messages/channels/ports Dominik Charousset (HAW Hamburg) libcppa July 2011 14 / 24

  25. Concurrency Approaches Summary There are basically two approaches: Provide a safe (free of race conditions) shared memory Clojure Intel C++ STM Compiler ... Model concurrent tasks/processes as independent components, communicating via messages/channels/ports Dominik Charousset (HAW Hamburg) libcppa July 2011 14 / 24

  26. Concurrency Approaches Summary There are basically two approaches: Provide a safe (free of race conditions) shared memory Clojure Intel C++ STM Compiler ... Model concurrent tasks/processes as independent components, communicating via messages/channels/ports Erlang (resp. the Actor Model in general) Google Go (channel based communication) ... Dominik Charousset (HAW Hamburg) libcppa July 2011 14 / 24

Download Presentation
Download Policy: The content available on the website is offered to you 'AS IS' for your personal information and use only. It cannot be commercialized, licensed, or distributed on other websites without prior consent from the author. To download a presentation, simply click this link. If you encounter any difficulties during the download process, it's possible that the publisher has removed the file from their server.

Recommend


More recommend