SlideShare a Scribd company logo
1 of 18
 Concurrency
 Thread
 Synchronization
 Thread
 Mutex
 Look
 Packaged tasks
 Future , Promise
01. void f(); // function
02.
03. struct F { // function object
04. void operator()(); // F's call operator (§3.4.3)
05. };
06.
07. void user()
08. {
09. thread t1 {f}; // f() executes in separate thread
10. thread t2 {F()}; // F()() executes in separate thread
11. t1.join(); // wait for t1
12. t2.join(); // wait for t2
13. }
01. void f() { cout << "Hello "; }
02.
03. struct F {
04. void operator()() { cout << "Parallel World!n"; }
05. };
PaHerallllel o World!
01. void f(vector<double>& v); // function do something with v
02. struct F { // function object: do something with v
03. vector<double>& v;
04. F(vector<double>& vv) :v{vv} { }
05. void operator()(); // application operator; §3.4.3
06. };
07.
08. int main()
09. {
10. vector<double> some_vec {1,2,3,4,5,6,7,8,9};
11. vector<double> vec2 {10,11,12,13,14};
12. thread t1 {f,some_vec}; // f(some_vec) execs in a separate thread
13. thread t2 {F{vec2}}; // F(vec2)() executes in a separate thread
14. t1.join();
15. t2.join();
16. }
01. void f(const vector<double>& v, double* res);
02. class F {
03. public:
04. F(const vector<double>& vv, double* p) : v{vv}, res{p} { }
05. void operator()(); // place result in *res
06. private:
07. const vector<double>& v; // source of input
08. double* res; // target for output
09. };
10.
11. int main()
12. {
13. vector<double> some_vec;
14. vector<double> vec2;
15. double res1, res2;
16. thread t1 {f,some_vec,&res1};
17. thread t2 {F{vec2,&res2}};
18. t1.join();
19. t2.join();
20. cout << res1 << ' ' << res2 << 'n';
21. }
01. mutex m; // controlling mutex
02. int sh; // shared data
03.
04. void f()
05. {
06. unique_lock<mutex> lck {m}; // acquire mutex
07. sh += 7; // manipulate shared data
08. } // release mutex implicitly
01. void f()
02. {
03. // ...
04. // defer_lock: don't yet try to acquire the mutex
05. unique_lock<mutex> lck1 {m1,defer_lock};
06. unique_lock<mutex> lck2 {m2,defer_lock};
07. unique_lock<mutex> lck3 {m3,defer_lock};
08. // ...
09. lock(lck1,lck2,lck3); // acquire all three locks
10. // ... manipulate shared data ...
11. } // implicitly release all mutexes
T 1
M 1
M 2
T 2
01. using namespace std::chrono; // see §35.2
02.
03. auto t0 = high_resolution_clock::now();
04. this_thread::sleep_for(milliseconds{20});
05. auto t1 = high_resolution_clock::now();
06. cout << duration_cast<nanoseconds>(t1–t0).count()
07. << " nanoseconds passedn";
01. class Message { // object to be communicated
02. // ...
03. };
04.
05. queue<Message> mqueue; // the queue of messages
06. condition_variable mcond; // the variable communicating events
07. mutex mmutex; // the locking mechanism
01. void consumer()
02. {
03. while(true) {
04. unique_lock<mutex> lck{mmutex}; // acquire mmutex
05. while (mcond.wait(lck)) /* do nothing */; // release lck and wait;
06. // re-acquire lck upon wakeup
07. auto m = mqueue.front(); // get the message
08. mqueue.pop();
09. lck.unlock(); // release lck
10. // ... process m ...
11. }
12. }
01. void producer()
02. {
03. while(true) {
04. Message m;
05. // ... fill the message ...
06. unique_lock<mutex> lck {mmutex}; // protect operations
07. mqueue.push(m);
08. mcond.notify_one(); // notify
09. } // release lock (at end of scope)
10. }
 future ‫و‬ promise
 packaged_task
 async()
01. X v = fx.get(); // if necessary, wait for the value to get computed
02.
03. void f(promise<X>& px) // a task: place the result in px
04. {
05. // ...
06. try {
07. X res;
08. // ... compute a value for res ...
09. px.set_value(res);
10. }
11. catch (...) { // oops: couldn't compute res
12. // pass the exception to the future's thread:
13. px.set_exception(current_exception());
14. }
15. }
01. void g(future<X>& fx) // a task: get the result from fx
02. {
03. // ...
04. try {
05. X v = fx.get(); // if necessary, wait for the value to get computed
06. // ... use v ...
07. }
08. catch (...) { // oops: someone couldn't compute v
09. // ... handle error ...
10. }
11. }
01. double comp2(vector<double>& v)
02. {
03. // type of task
04. using Task_type = double(double*,double*,double);
05. // package the task (i.e., accum)
06. packaged_task<Task_type> pt0 {accum};
07. packaged_task<Task_type> pt1 {accum};
08. // get hold of pt0's future
09. future<double> f0 {pt0.get_future()};
10. // get hold of pt1's future
11. future<double> f1 {pt1.get_future()};
12. double* first = &v[0];
13. // start a thread for pt0
14. thread t1 {move(pt0),first,first+v.size()/2,0};
15. // start a thread for pt1
16. thread t2 {move(pt1),first+v.size()/2,first+v.size(),0};
17. // ...
18. return f0.get()+f1.get(); // get the results
19. }
01. double comp4(vector<double>& v)
02. // spawn many tasks if v is large enough
03. {
04. if (v.size()<10000) return accum(v.begin(),v.end(),0.0);
05. auto v0 = &v[0];
06. auto sz = v.size();
07. auto f0 = async(accum,v0,v0+sz/4,0.0); // first quarter
08. auto f1 = async(accum,v0+sz/4,v0+sz/2,0.0); // second quarter
09. auto f2 = async(accum,v0+sz/2,v0+sz*3/4,0.0); // third quarter
10. auto f3 = async(accum,v0+sz*3/4,v0+sz,0.0); // fourth quarter
11. // collect and combine the results
12. return f0.get()+f1.get()+f2.get()+f3.get();
13. }
17. thread and deadlock

More Related Content

What's hot

OGRE v2.1 manual - Technical Overview
OGRE v2.1 manual - Technical OverviewOGRE v2.1 manual - Technical Overview
OGRE v2.1 manual - Technical OverviewRiver Wang
 
Random stability in systemVerilog and UVM based testbench
Random stability in systemVerilog and UVM based testbenchRandom stability in systemVerilog and UVM based testbench
Random stability in systemVerilog and UVM based testbenchKashyap Adodariya
 
20140531 serebryany lecture01_fantastic_cpp_bugs
20140531 serebryany lecture01_fantastic_cpp_bugs20140531 serebryany lecture01_fantastic_cpp_bugs
20140531 serebryany lecture01_fantastic_cpp_bugsComputer Science Club
 
NYU hacknight, april 6, 2016
NYU hacknight, april 6, 2016NYU hacknight, april 6, 2016
NYU hacknight, april 6, 2016Mikhail Sosonkin
 
ZeroNights: Automating iOS blackbox security scanning
ZeroNights: Automating iOS blackbox security scanningZeroNights: Automating iOS blackbox security scanning
ZeroNights: Automating iOS blackbox security scanningMikhail Sosonkin
 
Алексей Кутумов, Coroutines everywhere
Алексей Кутумов, Coroutines everywhereАлексей Кутумов, Coroutines everywhere
Алексей Кутумов, Coroutines everywhereSergey Platonov
 
Java synchronizers
Java synchronizersJava synchronizers
Java synchronizersts_v_murthy
 
Coroutines in Kotlin. UA Mobile 2017.
Coroutines in Kotlin. UA Mobile 2017.Coroutines in Kotlin. UA Mobile 2017.
Coroutines in Kotlin. UA Mobile 2017.UA Mobile
 
Introduction to Unit Testing (Part 2 of 2)
Introduction to Unit Testing (Part 2 of 2)Introduction to Unit Testing (Part 2 of 2)
Introduction to Unit Testing (Part 2 of 2)Dennis Byrne
 
Adventures In Data Compilation
Adventures In Data CompilationAdventures In Data Compilation
Adventures In Data CompilationNaughty Dog
 
個人メモ用(Pythonのexceptionをfromでかく理由)
個人メモ用(Pythonのexceptionをfromでかく理由)個人メモ用(Pythonのexceptionをfromでかく理由)
個人メモ用(Pythonのexceptionをfromでかく理由)KyutatsuNishiura
 

What's hot (15)

OGRE v2.1 manual - Technical Overview
OGRE v2.1 manual - Technical OverviewOGRE v2.1 manual - Technical Overview
OGRE v2.1 manual - Technical Overview
 
Random stability in systemVerilog and UVM based testbench
Random stability in systemVerilog and UVM based testbenchRandom stability in systemVerilog and UVM based testbench
Random stability in systemVerilog and UVM based testbench
 
20140531 serebryany lecture01_fantastic_cpp_bugs
20140531 serebryany lecture01_fantastic_cpp_bugs20140531 serebryany lecture01_fantastic_cpp_bugs
20140531 serebryany lecture01_fantastic_cpp_bugs
 
NYU hacknight, april 6, 2016
NYU hacknight, april 6, 2016NYU hacknight, april 6, 2016
NYU hacknight, april 6, 2016
 
ZeroNights: Automating iOS blackbox security scanning
ZeroNights: Automating iOS blackbox security scanningZeroNights: Automating iOS blackbox security scanning
ZeroNights: Automating iOS blackbox security scanning
 
Reactive x
Reactive xReactive x
Reactive x
 
Wcbpijwbpij new
Wcbpijwbpij newWcbpijwbpij new
Wcbpijwbpij new
 
Sniffing Mach Messages
Sniffing Mach MessagesSniffing Mach Messages
Sniffing Mach Messages
 
Алексей Кутумов, Coroutines everywhere
Алексей Кутумов, Coroutines everywhereАлексей Кутумов, Coroutines everywhere
Алексей Кутумов, Coroutines everywhere
 
8. abstract types
8. abstract types8. abstract types
8. abstract types
 
Java synchronizers
Java synchronizersJava synchronizers
Java synchronizers
 
Coroutines in Kotlin. UA Mobile 2017.
Coroutines in Kotlin. UA Mobile 2017.Coroutines in Kotlin. UA Mobile 2017.
Coroutines in Kotlin. UA Mobile 2017.
 
Introduction to Unit Testing (Part 2 of 2)
Introduction to Unit Testing (Part 2 of 2)Introduction to Unit Testing (Part 2 of 2)
Introduction to Unit Testing (Part 2 of 2)
 
Adventures In Data Compilation
Adventures In Data CompilationAdventures In Data Compilation
Adventures In Data Compilation
 
個人メモ用(Pythonのexceptionをfromでかく理由)
個人メモ用(Pythonのexceptionをfromでかく理由)個人メモ用(Pythonのexceptionをfromでかく理由)
個人メモ用(Pythonのexceptionをfromでかく理由)
 

Similar to 17. thread and deadlock

Practical JavaScript Programming - Session 7/8
Practical JavaScript Programming - Session 7/8Practical JavaScript Programming - Session 7/8
Practical JavaScript Programming - Session 7/8Wilson Su
 
FalsyValues. Dmitry Soshnikov - ECMAScript 6
FalsyValues. Dmitry Soshnikov - ECMAScript 6FalsyValues. Dmitry Soshnikov - ECMAScript 6
FalsyValues. Dmitry Soshnikov - ECMAScript 6Dmitry Soshnikov
 
NHibernate Configuration Patterns
NHibernate Configuration PatternsNHibernate Configuration Patterns
NHibernate Configuration PatternsLuca Milan
 
Javascript & Ajax Basics
Javascript & Ajax BasicsJavascript & Ajax Basics
Javascript & Ajax BasicsRichard Paul
 
The Promised Land (in Angular)
The Promised Land (in Angular)The Promised Land (in Angular)
The Promised Land (in Angular)Domenic Denicola
 
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
 
ES2015 (ES6) Overview
ES2015 (ES6) OverviewES2015 (ES6) Overview
ES2015 (ES6) Overviewhesher
 
NDC Sydney 2019 - Async Demystified -- Karel Zikmund
NDC Sydney 2019 - Async Demystified -- Karel ZikmundNDC Sydney 2019 - Async Demystified -- Karel Zikmund
NDC Sydney 2019 - Async Demystified -- Karel ZikmundKarel Zikmund
 
PerfUG - Disruptor at ABC Arbitrage - March 2018
PerfUG - Disruptor at ABC Arbitrage - March 2018PerfUG - Disruptor at ABC Arbitrage - March 2018
PerfUG - Disruptor at ABC Arbitrage - March 2018Olivier Coanet
 
Helma / RingoJS – Vienna.js Minitalk
Helma / RingoJS – Vienna.js MinitalkHelma / RingoJS – Vienna.js Minitalk
Helma / RingoJS – Vienna.js MinitalkPhilipp Naderer
 
Verilog Lecture5 hust 2014
Verilog Lecture5 hust 2014Verilog Lecture5 hust 2014
Verilog Lecture5 hust 2014Béo Tú
 
Kotlin coroutine - the next step for RxJava developer?
Kotlin coroutine - the next step for RxJava developer?Kotlin coroutine - the next step for RxJava developer?
Kotlin coroutine - the next step for RxJava developer?Artur Latoszewski
 

Similar to 17. thread and deadlock (20)

Practical JavaScript Programming - Session 7/8
Practical JavaScript Programming - Session 7/8Practical JavaScript Programming - Session 7/8
Practical JavaScript Programming - Session 7/8
 
Async I/O in Python
Async I/O in PythonAsync I/O in Python
Async I/O in Python
 
FalsyValues. Dmitry Soshnikov - ECMAScript 6
FalsyValues. Dmitry Soshnikov - ECMAScript 6FalsyValues. Dmitry Soshnikov - ECMAScript 6
FalsyValues. Dmitry Soshnikov - ECMAScript 6
 
NHibernate Configuration Patterns
NHibernate Configuration PatternsNHibernate Configuration Patterns
NHibernate Configuration Patterns
 
Javascript & Ajax Basics
Javascript & Ajax BasicsJavascript & Ajax Basics
Javascript & Ajax Basics
 
Le langage rust
Le langage rustLe langage rust
Le langage rust
 
Cuda 2
Cuda 2Cuda 2
Cuda 2
 
The Promised Land (in Angular)
The Promised Land (in Angular)The Promised Land (in Angular)
The Promised Land (in Angular)
 
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
 
ES2015 (ES6) Overview
ES2015 (ES6) OverviewES2015 (ES6) Overview
ES2015 (ES6) Overview
 
NDC Sydney 2019 - Async Demystified -- Karel Zikmund
NDC Sydney 2019 - Async Demystified -- Karel ZikmundNDC Sydney 2019 - Async Demystified -- Karel Zikmund
NDC Sydney 2019 - Async Demystified -- Karel Zikmund
 
PerfUG - Disruptor at ABC Arbitrage - March 2018
PerfUG - Disruptor at ABC Arbitrage - March 2018PerfUG - Disruptor at ABC Arbitrage - March 2018
PerfUG - Disruptor at ABC Arbitrage - March 2018
 
Using zone.js
Using zone.jsUsing zone.js
Using zone.js
 
Helma / RingoJS – Vienna.js Minitalk
Helma / RingoJS – Vienna.js MinitalkHelma / RingoJS – Vienna.js Minitalk
Helma / RingoJS – Vienna.js Minitalk
 
11. template
11. template11. template
11. template
 
Verilog Lecture5 hust 2014
Verilog Lecture5 hust 2014Verilog Lecture5 hust 2014
Verilog Lecture5 hust 2014
 
Multithreading in Java
Multithreading in JavaMultithreading in Java
Multithreading in Java
 
Kotlin coroutine - the next step for RxJava developer?
Kotlin coroutine - the next step for RxJava developer?Kotlin coroutine - the next step for RxJava developer?
Kotlin coroutine - the next step for RxJava developer?
 
ES6 generators
ES6 generatorsES6 generators
ES6 generators
 
50 jquery
50 jquery50 jquery
50 jquery
 

More from Vahid Heidari

15. map, unordered map, algorithms
15. map, unordered map, algorithms15. map, unordered map, algorithms
15. map, unordered map, algorithmsVahid Heidari
 
14. containers, vector, list
14. containers, vector, list14. containers, vector, list
14. containers, vector, listVahid Heidari
 
13. string, io streams
13. string, io streams13. string, io streams
13. string, io streamsVahid Heidari
 
12. standard library introduction
12. standard library introduction12. standard library introduction
12. standard library introductionVahid Heidari
 
9. class hierarchies
9. class hierarchies9. class hierarchies
9. class hierarchiesVahid Heidari
 
7. abstraction mechanisms, containers
7. abstraction mechanisms, containers7. abstraction mechanisms, containers
7. abstraction mechanisms, containersVahid Heidari
 
6. separation, namespace, error
6. separation, namespace, error6. separation, namespace, error
6. separation, namespace, errorVahid Heidari
 
5. struct, class, enum
5. struct, class, enum5. struct, class, enum
5. struct, class, enumVahid Heidari
 
2. types, vars, arith, consts
2. types, vars, arith, consts2. types, vars, arith, consts
2. types, vars, arith, constsVahid Heidari
 
1. preface, hello world
1. preface, hello world1. preface, hello world
1. preface, hello worldVahid Heidari
 

More from Vahid Heidari (14)

18. utilities
18. utilities18. utilities
18. utilities
 
16. smart pointers
16. smart pointers16. smart pointers
16. smart pointers
 
15. map, unordered map, algorithms
15. map, unordered map, algorithms15. map, unordered map, algorithms
15. map, unordered map, algorithms
 
14. containers, vector, list
14. containers, vector, list14. containers, vector, list
14. containers, vector, list
 
13. string, io streams
13. string, io streams13. string, io streams
13. string, io streams
 
12. standard library introduction
12. standard library introduction12. standard library introduction
12. standard library introduction
 
9. class hierarchies
9. class hierarchies9. class hierarchies
9. class hierarchies
 
7. abstraction mechanisms, containers
7. abstraction mechanisms, containers7. abstraction mechanisms, containers
7. abstraction mechanisms, containers
 
6. separation, namespace, error
6. separation, namespace, error6. separation, namespace, error
6. separation, namespace, error
 
5. struct, class, enum
5. struct, class, enum5. struct, class, enum
5. struct, class, enum
 
4. pointers, arrays
4. pointers, arrays4. pointers, arrays
4. pointers, arrays
 
3. tests, loops
3. tests, loops3. tests, loops
3. tests, loops
 
2. types, vars, arith, consts
2. types, vars, arith, consts2. types, vars, arith, consts
2. types, vars, arith, consts
 
1. preface, hello world
1. preface, hello world1. preface, hello world
1. preface, hello world
 

Recently uploaded

%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisamasabamasaba
 
WSO2Con204 - Hard Rock Presentation - Keynote
WSO2Con204 - Hard Rock Presentation - KeynoteWSO2Con204 - Hard Rock Presentation - Keynote
WSO2Con204 - Hard Rock Presentation - KeynoteWSO2
 
Artyushina_Guest lecture_YorkU CS May 2024.pptx
Artyushina_Guest lecture_YorkU CS May 2024.pptxArtyushina_Guest lecture_YorkU CS May 2024.pptx
Artyushina_Guest lecture_YorkU CS May 2024.pptxAnnaArtyushina1
 
Architecture decision records - How not to get lost in the past
Architecture decision records - How not to get lost in the pastArchitecture decision records - How not to get lost in the past
Architecture decision records - How not to get lost in the pastPapp Krisztián
 
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...WSO2
 
WSO2CON 2024 - Freedom First—Unleashing Developer Potential with Open Source
WSO2CON 2024 - Freedom First—Unleashing Developer Potential with Open SourceWSO2CON 2024 - Freedom First—Unleashing Developer Potential with Open Source
WSO2CON 2024 - Freedom First—Unleashing Developer Potential with Open SourceWSO2
 
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...masabamasaba
 
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
Direct Style Effect Systems -The Print[A] Example- A Comprehension AidDirect Style Effect Systems -The Print[A] Example- A Comprehension Aid
Direct Style Effect Systems - The Print[A] Example - A Comprehension AidPhilip Schwarz
 
WSO2CON 2024 - Does Open Source Still Matter?
WSO2CON 2024 - Does Open Source Still Matter?WSO2CON 2024 - Does Open Source Still Matter?
WSO2CON 2024 - Does Open Source Still Matter?WSO2
 
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...WSO2
 
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...masabamasaba
 
WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...
WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...
WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...WSO2
 
WSO2Con2024 - Enabling Transactional System's Exponential Growth With Simplicity
WSO2Con2024 - Enabling Transactional System's Exponential Growth With SimplicityWSO2Con2024 - Enabling Transactional System's Exponential Growth With Simplicity
WSO2Con2024 - Enabling Transactional System's Exponential Growth With SimplicityWSO2
 
What Goes Wrong with Language Definitions and How to Improve the Situation
What Goes Wrong with Language Definitions and How to Improve the SituationWhat Goes Wrong with Language Definitions and How to Improve the Situation
What Goes Wrong with Language Definitions and How to Improve the SituationJuha-Pekka Tolvanen
 
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024VictoriaMetrics
 
%in kempton park+277-882-255-28 abortion pills for sale in kempton park
%in kempton park+277-882-255-28 abortion pills for sale in kempton park %in kempton park+277-882-255-28 abortion pills for sale in kempton park
%in kempton park+277-882-255-28 abortion pills for sale in kempton park masabamasaba
 
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrainmasabamasaba
 
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...WSO2
 
WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...
WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...
WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...WSO2
 

Recently uploaded (20)

%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
 
WSO2Con204 - Hard Rock Presentation - Keynote
WSO2Con204 - Hard Rock Presentation - KeynoteWSO2Con204 - Hard Rock Presentation - Keynote
WSO2Con204 - Hard Rock Presentation - Keynote
 
Artyushina_Guest lecture_YorkU CS May 2024.pptx
Artyushina_Guest lecture_YorkU CS May 2024.pptxArtyushina_Guest lecture_YorkU CS May 2024.pptx
Artyushina_Guest lecture_YorkU CS May 2024.pptx
 
Architecture decision records - How not to get lost in the past
Architecture decision records - How not to get lost in the pastArchitecture decision records - How not to get lost in the past
Architecture decision records - How not to get lost in the past
 
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...
 
WSO2CON 2024 - Freedom First—Unleashing Developer Potential with Open Source
WSO2CON 2024 - Freedom First—Unleashing Developer Potential with Open SourceWSO2CON 2024 - Freedom First—Unleashing Developer Potential with Open Source
WSO2CON 2024 - Freedom First—Unleashing Developer Potential with Open Source
 
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
 
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
Direct Style Effect Systems -The Print[A] Example- A Comprehension AidDirect Style Effect Systems -The Print[A] Example- A Comprehension Aid
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
 
WSO2CON 2024 - Does Open Source Still Matter?
WSO2CON 2024 - Does Open Source Still Matter?WSO2CON 2024 - Does Open Source Still Matter?
WSO2CON 2024 - Does Open Source Still Matter?
 
Abortion Pills In Pretoria ](+27832195400*)[ 🏥 Women's Abortion Clinic In Pre...
Abortion Pills In Pretoria ](+27832195400*)[ 🏥 Women's Abortion Clinic In Pre...Abortion Pills In Pretoria ](+27832195400*)[ 🏥 Women's Abortion Clinic In Pre...
Abortion Pills In Pretoria ](+27832195400*)[ 🏥 Women's Abortion Clinic In Pre...
 
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...
 
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
 
WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...
WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...
WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...
 
WSO2Con2024 - Enabling Transactional System's Exponential Growth With Simplicity
WSO2Con2024 - Enabling Transactional System's Exponential Growth With SimplicityWSO2Con2024 - Enabling Transactional System's Exponential Growth With Simplicity
WSO2Con2024 - Enabling Transactional System's Exponential Growth With Simplicity
 
What Goes Wrong with Language Definitions and How to Improve the Situation
What Goes Wrong with Language Definitions and How to Improve the SituationWhat Goes Wrong with Language Definitions and How to Improve the Situation
What Goes Wrong with Language Definitions and How to Improve the Situation
 
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
 
%in kempton park+277-882-255-28 abortion pills for sale in kempton park
%in kempton park+277-882-255-28 abortion pills for sale in kempton park %in kempton park+277-882-255-28 abortion pills for sale in kempton park
%in kempton park+277-882-255-28 abortion pills for sale in kempton park
 
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
 
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
 
WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...
WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...
WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...
 

17. thread and deadlock

  • 1.
  • 3.  Thread  Mutex  Look  Packaged tasks  Future , Promise
  • 4. 01. void f(); // function 02. 03. struct F { // function object 04. void operator()(); // F's call operator (§3.4.3) 05. }; 06. 07. void user() 08. { 09. thread t1 {f}; // f() executes in separate thread 10. thread t2 {F()}; // F()() executes in separate thread 11. t1.join(); // wait for t1 12. t2.join(); // wait for t2 13. }
  • 5. 01. void f() { cout << "Hello "; } 02. 03. struct F { 04. void operator()() { cout << "Parallel World!n"; } 05. }; PaHerallllel o World!
  • 6. 01. void f(vector<double>& v); // function do something with v 02. struct F { // function object: do something with v 03. vector<double>& v; 04. F(vector<double>& vv) :v{vv} { } 05. void operator()(); // application operator; §3.4.3 06. }; 07. 08. int main() 09. { 10. vector<double> some_vec {1,2,3,4,5,6,7,8,9}; 11. vector<double> vec2 {10,11,12,13,14}; 12. thread t1 {f,some_vec}; // f(some_vec) execs in a separate thread 13. thread t2 {F{vec2}}; // F(vec2)() executes in a separate thread 14. t1.join(); 15. t2.join(); 16. }
  • 7. 01. void f(const vector<double>& v, double* res); 02. class F { 03. public: 04. F(const vector<double>& vv, double* p) : v{vv}, res{p} { } 05. void operator()(); // place result in *res 06. private: 07. const vector<double>& v; // source of input 08. double* res; // target for output 09. }; 10. 11. int main() 12. { 13. vector<double> some_vec; 14. vector<double> vec2; 15. double res1, res2; 16. thread t1 {f,some_vec,&res1}; 17. thread t2 {F{vec2,&res2}}; 18. t1.join(); 19. t2.join(); 20. cout << res1 << ' ' << res2 << 'n'; 21. }
  • 8. 01. mutex m; // controlling mutex 02. int sh; // shared data 03. 04. void f() 05. { 06. unique_lock<mutex> lck {m}; // acquire mutex 07. sh += 7; // manipulate shared data 08. } // release mutex implicitly
  • 9. 01. void f() 02. { 03. // ... 04. // defer_lock: don't yet try to acquire the mutex 05. unique_lock<mutex> lck1 {m1,defer_lock}; 06. unique_lock<mutex> lck2 {m2,defer_lock}; 07. unique_lock<mutex> lck3 {m3,defer_lock}; 08. // ... 09. lock(lck1,lck2,lck3); // acquire all three locks 10. // ... manipulate shared data ... 11. } // implicitly release all mutexes T 1 M 1 M 2 T 2
  • 10. 01. using namespace std::chrono; // see §35.2 02. 03. auto t0 = high_resolution_clock::now(); 04. this_thread::sleep_for(milliseconds{20}); 05. auto t1 = high_resolution_clock::now(); 06. cout << duration_cast<nanoseconds>(t1–t0).count() 07. << " nanoseconds passedn";
  • 11. 01. class Message { // object to be communicated 02. // ... 03. }; 04. 05. queue<Message> mqueue; // the queue of messages 06. condition_variable mcond; // the variable communicating events 07. mutex mmutex; // the locking mechanism 01. void consumer() 02. { 03. while(true) { 04. unique_lock<mutex> lck{mmutex}; // acquire mmutex 05. while (mcond.wait(lck)) /* do nothing */; // release lck and wait; 06. // re-acquire lck upon wakeup 07. auto m = mqueue.front(); // get the message 08. mqueue.pop(); 09. lck.unlock(); // release lck 10. // ... process m ... 11. } 12. }
  • 12. 01. void producer() 02. { 03. while(true) { 04. Message m; 05. // ... fill the message ... 06. unique_lock<mutex> lck {mmutex}; // protect operations 07. mqueue.push(m); 08. mcond.notify_one(); // notify 09. } // release lock (at end of scope) 10. }
  • 13.  future ‫و‬ promise  packaged_task  async()
  • 14. 01. X v = fx.get(); // if necessary, wait for the value to get computed 02. 03. void f(promise<X>& px) // a task: place the result in px 04. { 05. // ... 06. try { 07. X res; 08. // ... compute a value for res ... 09. px.set_value(res); 10. } 11. catch (...) { // oops: couldn't compute res 12. // pass the exception to the future's thread: 13. px.set_exception(current_exception()); 14. } 15. }
  • 15. 01. void g(future<X>& fx) // a task: get the result from fx 02. { 03. // ... 04. try { 05. X v = fx.get(); // if necessary, wait for the value to get computed 06. // ... use v ... 07. } 08. catch (...) { // oops: someone couldn't compute v 09. // ... handle error ... 10. } 11. }
  • 16. 01. double comp2(vector<double>& v) 02. { 03. // type of task 04. using Task_type = double(double*,double*,double); 05. // package the task (i.e., accum) 06. packaged_task<Task_type> pt0 {accum}; 07. packaged_task<Task_type> pt1 {accum}; 08. // get hold of pt0's future 09. future<double> f0 {pt0.get_future()}; 10. // get hold of pt1's future 11. future<double> f1 {pt1.get_future()}; 12. double* first = &v[0]; 13. // start a thread for pt0 14. thread t1 {move(pt0),first,first+v.size()/2,0}; 15. // start a thread for pt1 16. thread t2 {move(pt1),first+v.size()/2,first+v.size(),0}; 17. // ... 18. return f0.get()+f1.get(); // get the results 19. }
  • 17. 01. double comp4(vector<double>& v) 02. // spawn many tasks if v is large enough 03. { 04. if (v.size()<10000) return accum(v.begin(),v.end(),0.0); 05. auto v0 = &v[0]; 06. auto sz = v.size(); 07. auto f0 = async(accum,v0,v0+sz/4,0.0); // first quarter 08. auto f1 = async(accum,v0+sz/4,v0+sz/2,0.0); // second quarter 09. auto f2 = async(accum,v0+sz/2,v0+sz*3/4,0.0); // third quarter 10. auto f3 = async(accum,v0+sz*3/4,v0+sz,0.0); // fourth quarter 11. // collect and combine the results 12. return f0.get()+f1.get()+f2.get()+f3.get(); 13. }

Editor's Notes

  1. ما در این ویدیو وارد فصل 5 کتاب شدیم که در مورد concurrency و utilityهای کتابخونه استاندارده. توی این ویدیو بحث مهم concurrency رو داریم و مفاهیم مربوط به اون رو میگم. بعد در مورد ابزار ها concurrency صحبت می کنیم و thread رو معرفی می کنم و در آخر در مورد synchronization صحبت خواهم کرد.
  2. مفهوم concurrency اینه که ما بتونیم به صورت همزمان چند تا task رو با هم انجام بدیم. Concurrency برای بالا بردن throughput سیستم و همینطور کم کردن زمان پاسخ به یه درخواست بکار میره. تمام زبانهای برنامه نویسی مدرن امکاناتی برای همروندی برنامه ها ارائه میدن. در C++ کتابخونه استاندارد یسری امکانات برای این منظور فراهم کرده. هدف از این فراهم کردن این امکانات هم اینه که یه سری پشتیبانی از قابلیت های سیستمی رو فراهم کنه ولی در عین حال نمیخواد امکانات خیلی سطح بالا و پیچیده رو به کتابخونه استاندارد اضافه کنه. کتابخونه استاندارد امکاناتی برای ایجاد کردن threadها داره و یه سری عملیات های atomic رو هم پشتیبانی میکنه. امکاناتی که کتابخونه استاندارد به ما میده شامل thread، mutexها، lookها، packaged_taskها و futureهاست. این موارد به صورت مستقیم با سیستم عامل و امکاناتی که سیستم عامل داره در ارتباط هستند. در ادامه به صورت مختصر هر کدوم رو معرفی خواهم کرد.
  3. ما تمامی محاسبات یا عملیات هایی که می تونیم به صورت هم روند یا Concurrent اجرا کنیم task میگیم. Threadیه representation ی system-level از task هست که در برنامه ها می تونیم استفاده کنیم. یه Task میتونه به صورت هم زمان با بقیه task ها اجرا بشه. Threadهای یه Porcess ، یک فضای آدرس مشترک رو به اشتراک میذارن. اما Processها به خودی خود هیچ داده ای رو با هم به اشتراک نمی ذارن. در threadها بخاط اینکه address space به اشتراک گذاشته میشه میتونیم از طریق objectهایی که به اشتراک گداشته میشن با هم تبادل اطلاعات کنن. این تبادل اطلاعات با استفاده از lookها کنترل میشه تا جلوی race بین threadها گرفته بشه. با استفاده از std::thread که در هدر فایل thread هست میتونیم thread ایجاد کنیم. در خط 9 با استفاده از یه تابع و توی خط 10 با یه فانکتور دوتا thread ایجاد کردیم. با فراخوانی تابع join مطمئن میشیم که تا زمانی که thread تموم نشده از تابع User خارج نمی شیم. معنی join اینه که صبر کن تا thread تموم بشه.
  4. برنامه های concurrent اگه به خوبی نوشته نشده باشن میتونن رفتار های خیلی عجیبی داشته باشن. برای مثال فرض کنید که دو تا task به این صورت نوشتیم. توی هر 2 تا یه پیغامی رو چاپ می کنیم. حالا اگه بین این 2 تا task هماهنگی نباشه و با هم synchronize نشن خروجی غیر قابل پیشبینی میشه و در نهایت خراب میشه. در برنامه های concurrent ترتیب اجرای taskها قابل پیش بینی نیست درنتیجه ممکنه در هر لحظه یه task اجراش متوقف بشه و یهtask دیگه انجام بشه و به همین ترتیب task دوم متوقف بشه و task اول دوباره از ادامه ی اون جایی که متوقف شده ادامه پیدا کنه. اگه این برنامه اجرا بشه ممکنه خروجی یه چیزی شبیه این بشه. خروجی به صورت نامفهومه چون وسط چاپ کردن یه پیغام task متوقف شده و task دیگه اجرا شده. این اتفاق بخاطر این میفته که هر 2 تا task از cout به صورت مشترک و بدون synchronization استفاده کردن. خروجی خیلی غیر قابل پیش بینیه حتی ممکنه یه وقتایی هم درست چاپ بشه. زمانی که ما taskهای concurrent تعریف میکنیم دوست داریم تا جایی که ممکنه این taskها از هم جدا باشن و به هم وابسته نباشن. نحوه ی ارتباط برقرار کردن اونا به هم باید خیلی ساده و واضح باشه.
  5. یه راه ساده برای اینکه مفهوم taskهای concurrent رو متوجه بشیم اینه که فرض کنیم که اونا functionهایی هستند که همزمان، با کسی که اونا رو فراخوانی کرده در حال انجام شدن هستند. این taskها که ما مثل functionها فرض کردیم، برای اینکه یه عملیاتی رو انجام بدن باید آرگمان هایی بهشون پاس بشه و نتیجه ی عملیات اونا هم باید برگردونده بشه. برای ایجاد کردن thread ما 2 راه داریم استفاده از function معمولی و استفاده از functor. وقتی از function استفاده می کنیم می تونیم یه reference به عنوان ورودی بهش بدیم و خروجی کار thread رو هم reference برگردونیم. برای استفاده از functor هم یه reference از آرگمانی که میخواد روش یه عملیاتی رو انجام بده رو داخلش به صورت member نگه می داریم Thread ی t1 با تابع f ساخته می شه و این تابع رو توی یه thread جدا اجرا میکنه. آرگمانهای ورودی thread هم به عنوان آرگمانهای تابع f بهش پاس داده میشن. و thread ی t2 رو با functor میسازیم و اپراتور () اون توسط thread اجرا خواهد شد.
  6. توی این اسلاید در مورد برگردوندن نتیجه از thread یه مثال می بینیم. در مثال قبلی تونستیم با Reference const یسری آرگمان رو به thread پاس کنیم. برای اینکه نتیجه عملیات رو از thread دریافت کنیم میتونیم بجای const reference از reference و یا Pointer استفاده کنیم.
  7. بعضی وقتا نیاز داریم که بین taskها یه سری data رو به اشتراک بذاریم. در این صورت هر وقت می خوایم به اون data ، access داشته باشیم نیاز به مکانیزم هایی برای synchronization داریم . یکی از پایه ای ترین چیزایی که برای همگام سازی استفاده میشه Mutex هست. Mutex مخفف mutual exclusion object هست. یه mutex با فراخوانی تابع Lock، acquire میشه. Unique_lock در constructorش تابع Lock رو call میکنه و در صورتی که یه thread دیگه زودتر این mutex رو acquire کرده باشه این thread رو block میکنه و زمانی که اون thread کارش تموم بشه و Mutex رو آزاد کنه block می مونه. زمانی که کار thread با اونdataیی که share شده تموم بشه و از تابع خارج بشه در destructorی unique_lock، تابع unlock صدا زده میشه و Mutex آزاد میشه در نتیجه اون threadیی که block شده بود از block در میاد و می تونه به dataی share شده دسترسی داشته باشه.
  8. معمولا ما نیاز داریم همزمان چندتا resource رو بین چند تا thread به اشتراک بذاریم. این وضعیت ممکنه باعث بن بست در اجرای برنامه بشه. برای مثال فرض کنید که threadشماره 1، Mutex1 رو در اختیار بگیره و سعی کنه که Mutex2 رو که قبلا thread2 در اختیار گرفته رو در اختیار بگیره. و در همون زمان thread2 هم بیاد mutex1 رو بخواد در اختیار بگیره. دراین وضعیت هر 2 تا thread؛ block میشن و هر کدوم منتظرن اون یکی منابع رو آزاد کنه در صورتی که هیچ وقت اون منابعی که در اختیار گرفتن آزاد نمی شه و تا ابد هر 2 تا thread در وضعیت block می مونن. به این حالت deadlock یا بن بست گفته میشه. کتابخونه استاندارد امکاناتی برای در اختیار گرفتن همزمان چند تا Mutex به ما میده. این Lock تنها در صورت انجام میشه که همه ی mutexهایی که به عنوان آرگمان داده شدن با هم قابل acquire شدن باشن در غیر این صورت block نمیشه.
  9. گاهی وقت ها یه thread باید منتظر وقوع یه رخداد خارجی باشه، مثلا باید تا زمانی که یه thread دیگه کارش تموم نشده، اجراش متوقف شده باشه یا مثلا تا یه مدت زمانی منتظر بمونه و زمانی که timeoutشد شروع به کار بکنه. ساده ترین راه برای اینکه یه thread منتظر بمونه اینه که یه مدت زمانی رو براش مشخص کنیم. توی این مثال ما هیچ threadیی رو اجرا نکردیم ولی هر برنامه ای حداقل یه thread داره که main داره توش اجرا میشه. اون threadیی که الان داره اجرا میشه با this_thread مشخص میشه و با تابع sleep_for می تونیم به مدت زمان مشخصی یه thread رو به حالت sleep در بیاریم. کتابخونه استاندارد برای کار با متغییرهایی از نوع زمان یه کتابخونه به نام chrono داره که امکاناتی در این مورد محاسبات زمانی و تبدیلات زمانها به هم رو ما میده. امکاناتی مشابه ctime میده ولی خیلی از نظر امکانات پیشرفته تره و type safeتره.
  10. یکی دیگه از امکاناتی که به ما اجازه میده که منتظر رخدادهای خارجی بمونیم condition_variableها هستند. این مکانیزم به ما اجازه میده که یه thread منتظر یه شرایطی بمونه. به این شرایط میگیم event، و معمولا هم نتیجه ی کار یه thread دیگست. فرض کنید 2 تا thread داریم که با message passing بینشون با استفاه از صف با هم ارتباط بر قرار میکنن. یه صف به نام mqueue، یه condition_variable به نام mcond و یه mutex به نام mmutex داریم. و یه کلاس message داریم که تمام اطلاعاتی که 2 تا thread می خوان به هم پاس بدن رو درش پیاده سازی کردیم. یه consumer یا مصرف کننده داریم که messageها رو از توی صف بر میداره و مصرف میکنه. ما با استفاده از lck تمام عملیات هایی که روی صف قراره انجام بشه رو محافظت کردیم و با lock کردن mmutex می تونیم مطمئن بشیم که thread دیگه ای به صف دسترسی نخواهد داشت. Condition_variable با آزاد کردن lck به حالت wait میره و منتظر می مونه که یه نفر اون رو مطلع کنه که صف خالی نیست. به محض اینکه صف پر باشه از حالت wait در میاد و lck رو lock می کنه تا thread دیگه ای به صف دسترسی نداشته باشه.
  11. کدهای Producer یا تولید کننده هم به این صورت خواهد بود. تولید کننده یه message رو میسازه و اونو با اطلاعاتی که داره پر میکنه. بعد با lock کردن lck درصورتی که thread ی consumer اونو در اختیار نداشته باشه، صف رو در اختیار میگیره و میتونه Messageیی که ساخته رو درون اون Push کنه. و در آخر هم با استفاده از condition_variable ، thread ی consumer رو از پر شدن صف مطلع می کنه. به این صورت ما با استفاده از condition_variable 2 تا thread رو به هم مرتبط کردیم. Condition_variable امکانات خیلی زیادی برای share کردن اطلاعات در اختیار ما میذاره که خیلی بهیه سازی شدن و کاربرد دارن.
  12. کتابخونه استاندارد یه سری امکاناتی برای ارتباط بین task ها هم فراهم کرده. Future و promise برای برگردوندن یه مقدار به عنوان حاصل یه سری عملیات هست که توسط یه thread انجام شده و میخوایم توی یه thread دیگه ازش استفا ده کنیم. Packaged_task برای کمک کردن به اجرای taskها و ایجاد یه مکانیزم برای برگردوندن نتایج بکار میره و در واقع یه wrapper روی future و promise هست. Async() هم برای اجرای task مشابه function call بکار میره در ادامه هر کدوم رو مختصرا شرح میدم.
  13. ایده ی پشت future و promise اینه که دوتا task بتونن بدو اینکه به صورت مستقیم از lock استفاده کنن یه مقداری رو به هم دیگه انتقال بدن. پیاده سازی به این صورته که زمانی که یه task می خواد یه مقداری رو به یه task دیگه منتقل کنه اونو در promise میذاره و اون taskیی که به اوم مقدار نیاز داره از طریق future متناظر promise به اون دسترسی پیدا میکنه. اگر یه future داشته باشیم می تونیم یه مقدار رو با استفاده از get() از اون بخونیم. در صورتی که هنوز مقدار اون future توسط taskیی که باید اونو فراهم کنه حاضر نباشه کسی که get رو فراخوانی کرده به وضعیت wait میره و block میشه. اگه اصلا اون threadیی که باید یه مقداری رو برای ما فراهم که نتونه محاسبات رو انجام بده و مقداری رو نتونه قرار بده تابع get یه exception رو throw می کنه. با Promise ما می تونیم مقداری که قراره محاسبه بشه رو برای کسی که منتظر این مقدار هست بفرستیم . با استفاده از set_value و set_exception میتونیم این کار رو بکنیم تا در future با تابع get اون مقدار دریافت بشه. تابع current_exception ، exceptionیی رو بر میگردونه که الان catch شده و با استفاده از set_exception اون exception رو برای Future می فرستیم.
  14. Threadیی هم که به عنوان future هست به این صورت خواهد شد. با تابع get مقداری که قراره در یه thread دیگه محاسبه بشه رو ،دریافت می کنیم. و اگه exception رخ داده باشه و اون thread اصلا نتونه محاسبات رو انجام بده هم در catch متوجه خطا میشیم.
  15. کتابخونه استاندارد برای راحت تر استفاده کردن از future و promise یه warpper به نام packaged_task روی اونا کشیده تا کارها رو ساده تر کنه. به این صورت که در اون taskیی که نیاز داریم مقداری رو بخونیم از تابع get_future استفاده می کنیم و همین طور برای قراردادن مقدار محاسبه شده و یا exception رخداده هم می شه از packaged_task استفاده کرد. فرض کنید که دوتا task داریم که توی هر کدون نصفی از یه وکتور رو میدیم و حاصل جمع تمام عناصر اون قسمت از وکتور رو حساب می کنیم و بر می گردونیم. با اون 2 تا packeged_task ، 2 تا thread ایجاد می کنیم و چون نمی تونیم packeged_task رو کپی کنیم باید اونو move کنیم. حالا میتونیم مقدار محاسبه شده توسط هر task رو با get بگیریم و بعد با جمع کردن اون 2 تا، حاصل جمع کل وکتور رو محاسبه کنیم. همون طور که میبینید ما مستقیما از lock توی این کدها استفاده نکردیم.
  16. در این فصل هدف من این بوده که به ساده ترین صورت ممکن مفاهیم رو مطرح کنم و در عین حال قوی ترین ابزار هایی که در اختیار داریم رو هم معرفی کنم. مثلا با task مثل یه function رفتار کنیم که به صورت همروند یا concurrent با بقیه taskها اجرا میشه. این ساده سازی خیلی از نیاز های ما رو جواب میده. حالا بعد از ساده سازی task به function ما با استفاده از async ما قسمتی که باید function call بکنیم از قسمتی که باید نتایج رو دریافت کنیم از هم جدا می کنیم. در اصطلاح call part رو از قسمت get the result part جدا میکنیم. وقتی از async استفاده می کنیم دیگه لازم نیست حتی به thread و lock هم فکر کنیم بلکه به این فکر می کنیم که یه task چیزیه که به صورت asynchronously یا غیر همزمان اجرا میشه و نتیجه رو بر میگردونه. ولی این روش همچنان محدودیت هایی داره مثلا اگه یه resource باید با lock کردن share بشه نمیشه از async استفاده کرد. اما با async شما دیگه حتی لازم نیست که بدونید که threadها چطور ساخته میشن. خود async این کار ها رو انجام میده. میشه از async برای ایجاد کردن taskها استفاده کرد مثلا برای گرفتن ورودی از کاربر در محیط های گرافیکی و GUI خیلی استفاده میشه. توی این محیط ها شما یه thread اصلی دارین که UI ها رو روی صفحه رسم میکنه و یک یا چند thread دیگه دارید که از ورودی هایی مثل mouse و keyboard دارن اطلاعات رو میخونن.