{"id":5481,"date":"2018-08-09T17:39:27","date_gmt":"2018-08-09T17:39:27","guid":{"rendered":"https:\/\/www.modernescpp.com\/index.php\/i-m-proud-to-present-modern-c-concurrency-is-available-as-interactive-course\/"},"modified":"2018-08-09T17:39:27","modified_gmt":"2018-08-09T17:39:27","slug":"i-m-proud-to-present-modern-c-concurrency-is-available-as-interactive-course","status":"publish","type":"post","link":"https:\/\/www.modernescpp.com\/index.php\/i-m-proud-to-present-modern-c-concurrency-is-available-as-interactive-course\/","title":{"rendered":"I&#8217;m Proud to Present: Modern C++ Concurrency is available as interactive course"},"content":{"rendered":"<p>Based on my book &#8220;Concurrency with Modern C++&#8221; educative.io created an interactive course. You can have it now at a discount of 38 %.<\/p>\n<p><strong>&#8220;Modern C++ Concurrency<\/strong>&#8221; is an interactive journey through current and upcoming concurrency in C++.<\/p>\n<ul>\n<li><strong>C++11<\/strong> and <strong>C++14 <\/strong>have the basic building blocks for creating concurrent or parallel programs.<\/li>\n<li>With <strong>C++17<\/strong> we got the parallel algorithms of the Standard Template Library (STL). That means, most of the algorithms of the STL can be executed sequential, parallel, or vectorized.<\/li>\n<li>The concurrency story in C++ goes on. With <strong>C++20<\/strong> we can hope for extended futures, coroutines, transactions, and more.<\/li>\n<\/ul>\n<p><!--more--><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<a href=\"https:\/\/goo.gl\/2qWUkK\"><img loading=\"lazy\" decoding=\"async\" class=\" size-full wp-image-5294\" src=\"https:\/\/www.modernescpp.com\/wp-content\/uploads\/2017\/08\/educative.png\" alt=\"educative\" width=\"600\" height=\"304\" style=\"display: block; margin-left: auto; margin-right: auto;\" srcset=\"https:\/\/www.modernescpp.com\/wp-content\/uploads\/2017\/08\/educative.png 1012w, https:\/\/www.modernescpp.com\/wp-content\/uploads\/2017\/08\/educative-300x152.png 300w, https:\/\/www.modernescpp.com\/wp-content\/uploads\/2017\/08\/educative-768x389.png 768w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/a><\/p>\n<h2><span class=\"ez-toc-section\" id=\"How_to_Get_it\"><\/span>How to Get it?<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Use the link to educative: <a href=\"https:\/\/goo.gl\/2qWUkK\">Modern C++ Concurrency: Get the most out of any machine<\/a><\/p>\n<h2><span class=\"ez-toc-section\" id=\"Whats_Inside\"><\/span>What&#8217;s Inside?<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<ul>\n<li>140 lessons<\/li>\n<li>110 code playgrounds =&gt; Run in browser<\/li>\n<li>78 code snippets<\/li>\n<li>55 illustrations<\/li>\n<\/ul>\n<p>This interactive course <strong>explains the details of concurrency<\/strong> in modern C++ and gives you, in addition,<strong> more than 100 running code examples<\/strong>. Therefore you can combine the theory with the practices and get the most of it.<\/p>\n<p>Because this interactive course is about concurrency, I<strong> present a lot of pitfalls and show you how to overcome them<\/strong>.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Give_me_the_Details\"><\/span>Give me the Details!<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>If you are curious and you should be, here are the details to the more than 300 pages:<\/p>\n<ul>\n<li class=\"_3nmeicAGQ4cByh_i8bPFBh\">\n<h3 class=\"_3cqdxhUVTb9hlTjlKaCzKD\"><span class=\"ez-toc-section\" id=\"Introduction\"><\/span>Introduction<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul class=\"_2IEo3eLPKRdVWEgf5J0f-p\">\n<li>Guide to Follow this Course<\/li>\n<\/ul>\n<\/li>\n<li class=\"_3nmeicAGQ4cByh_i8bPFBh\">\n<h3 class=\"_3cqdxhUVTb9hlTjlKaCzKD\"><span class=\"ez-toc-section\" id=\"A_Quick_Overview\"><\/span>A Quick Overview<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul class=\"_2IEo3eLPKRdVWEgf5J0f-p\">\n<li><a href=\"https:\/\/www.educative.io\/collection\/page\/10370001\/5731772033662976\/5768399514763264\" class=\"_3vWNGgXD8bGOnBLQBSjs4t\">C++11 and C++14: The Foundation<span class=\"_1WCF_LT6u3qGl2MXXlPev1\">Preview<\/span><\/a><\/li>\n<li><a href=\"https:\/\/www.educative.io\/collection\/page\/10370001\/5731772033662976\/5633369601736704\" class=\"_3vWNGgXD8bGOnBLQBSjs4t\">Multithreading in C++<span class=\"_1WCF_LT6u3qGl2MXXlPev1\">Preview<\/span><\/a><\/li>\n<li><a href=\"https:\/\/www.educative.io\/collection\/page\/10370001\/5731772033662976\/5142934164865024\" class=\"_3vWNGgXD8bGOnBLQBSjs4t\">Case Studies<span class=\"_1WCF_LT6u3qGl2MXXlPev1\">Preview<\/span><\/a><\/li>\n<li>C++17: Parallel Algorithms of the Standard Template Library<span class=\"_1WCF_LT6u3qGl2MXXlPev1\">Preview<\/span><\/li>\n<li>C++20: The Concurrent Future<\/li>\n<li>Challenging Issues in C++<\/li>\n<\/ul>\n<\/li>\n<li class=\"_3nmeicAGQ4cByh_i8bPFBh\">\n<h3 class=\"_3cqdxhUVTb9hlTjlKaCzKD\"><span class=\"ez-toc-section\" id=\"Memory_Model_The_Contract\"><\/span>Memory Model: The Contract<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul class=\"_2IEo3eLPKRdVWEgf5J0f-p\">\n<li>The Contract<\/li>\n<li>The Foundation &amp; Challenges<\/li>\n<\/ul>\n<\/li>\n<li class=\"_3nmeicAGQ4cByh_i8bPFBh\">\n<h3 class=\"_3cqdxhUVTb9hlTjlKaCzKD\"><span class=\"ez-toc-section\" id=\"Memory_Model_Atomics\"><\/span>Memory Model: Atomics<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul class=\"_2IEo3eLPKRdVWEgf5J0f-p\">\n<li>Strong Memory Model<\/li>\n<li>Weak Memory Model<\/li>\n<li>The Atomic Flag<\/li>\n<li>Spinlock vs. Mutex<\/li>\n<li><span style=\"font-family: courier new, courier;\">std::atomic&lt;bool&gt;<\/span><\/li>\n<li>User-Defined Atomics<\/li>\n<li>All Atomic Operations<\/li>\n<li>Free Atomic Functions<\/li>\n<li>Atomic Operations on <span style=\"font-family: courier new, courier;\">std::shared_ptr<\/span><\/li>\n<\/ul>\n<\/li>\n<li class=\"_3nmeicAGQ4cByh_i8bPFBh\">\n<h3 class=\"_3cqdxhUVTb9hlTjlKaCzKD\"><span class=\"ez-toc-section\" id=\"Memory_Model_Synchronization_and_Ordering_Constraints\"><\/span>Memory Model: Synchronization and Ordering Constraints<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul class=\"_2IEo3eLPKRdVWEgf5J0f-p\">\n<li>Introduction<\/li>\n<li>Types of Synchronization &amp; Ordering Constraints<\/li>\n<li>Sequential Consistency<\/li>\n<li>Acquire Release Semantic<\/li>\n<li>Is Acquire-Release Semantic Transitive?<\/li>\n<li>Acquire Release: The Typical Misunderstanding<\/li>\n<li><span style=\"font-family: courier new, courier;\">std::memory_order_consume<\/span><\/li>\n<li>Data dependencies with <span style=\"font-family: courier new, courier;\">std::memory_order_consume<\/span><\/li>\n<li>Relaxed Semantic<\/li>\n<\/ul>\n<\/li>\n<li class=\"_3nmeicAGQ4cByh_i8bPFBh\">\n<h3 class=\"_3cqdxhUVTb9hlTjlKaCzKD\"><span class=\"ez-toc-section\" id=\"Memory_Model_Fences\"><\/span>Memory Model: Fences<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul class=\"_2IEo3eLPKRdVWEgf5J0f-p\">\n<li>Fences as Memory Barriers<\/li>\n<li>The Three Fences<\/li>\n<li>Acquire Release Fences<\/li>\n<li>Synchronization with Atomic Variables<\/li>\n<li>Synchronization with Fences<\/li>\n<\/ul>\n<\/li>\n<li class=\"_3nmeicAGQ4cByh_i8bPFBh\">\n<h3 class=\"_3cqdxhUVTb9hlTjlKaCzKD\"><span class=\"ez-toc-section\" id=\"Multithreading_Threads\"><\/span>Multithreading: Threads<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul class=\"_2IEo3eLPKRdVWEgf5J0f-p\">\n<li><a href=\"https:\/\/www.educative.io\/collection\/page\/10370001\/5731772033662976\/5756551042170880\" class=\"_3vWNGgXD8bGOnBLQBSjs4t\">Introduction to Threads<span class=\"_1WCF_LT6u3qGl2MXXlPev1\">Preview<\/span><\/a><\/li>\n<li>Creation of Threads<\/li>\n<li>Managing Thread Lifetime<\/li>\n<li>Thread Lifetime Management: Warnings and Tips<\/li>\n<li>Passing Arguments to Threads<\/li>\n<li>Arguments of Threads: Undefined behaviour<\/li>\n<li>Arguments of Threads &#8211; Race Conditions and Locks<\/li>\n<li>Methods of Threads<\/li>\n<li>Methods of Threads in Practice<\/li>\n<\/ul>\n<\/li>\n<li class=\"_3nmeicAGQ4cByh_i8bPFBh\">\n<h3 class=\"_3cqdxhUVTb9hlTjlKaCzKD\"><span class=\"ez-toc-section\" id=\"Multithreading_Shared_Data\"><\/span>Multithreading: Shared Data<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul class=\"_2IEo3eLPKRdVWEgf5J0f-p\">\n<li>Introduction to Shared Data<\/li>\n<li>Introduction to Mutexes<\/li>\n<li>Mutex Types and Locking Methods<\/li>\n<li>Issues of Mutexes: Deadlocks<\/li>\n<li>Issues of Mutexes: Avoiding Exceptions<\/li>\n<li>Types of Locks: <span style=\"font-family: courier new, courier;\">std::lock_guard<\/span><\/li>\n<li>Types of Locks: <span style=\"font-family: courier new, courier;\">std::unique_lock<\/span><\/li>\n<li>Types of Locks:<span style=\"font-family: courier new, courier;\"> std::shared_lock<\/span><\/li>\n<li>Thread-Safe Initialization<\/li>\n<li>Thread-Safe Initialization: Constant Expressions<\/li>\n<li>Thread-Safe Initialization: <span style=\"font-family: courier new, courier;\">call_once<\/span> and <span style=\"font-family: courier new, courier;\">once_flag<\/span><\/li>\n<li>Thread-Safe Initialization &#8211; Static Variables with Block Scope<\/li>\n<\/ul>\n<\/li>\n<li class=\"_3nmeicAGQ4cByh_i8bPFBh\">\n<h3 class=\"_3cqdxhUVTb9hlTjlKaCzKD\"><span class=\"ez-toc-section\" id=\"Multithreading_Local_Data\"><\/span>Multithreading: Local Data<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul class=\"_2IEo3eLPKRdVWEgf5J0f-p\">\n<li>Thread Local Data<\/li>\n<\/ul>\n<\/li>\n<li class=\"_3nmeicAGQ4cByh_i8bPFBh\">\n<h3 class=\"_3cqdxhUVTb9hlTjlKaCzKD\"><span class=\"ez-toc-section\" id=\"Multithreading_Condition_Variables\"><\/span>Multithreading: Condition Variables<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul class=\"_2IEo3eLPKRdVWEgf5J0f-p\">\n<li>Condition Variables<\/li>\n<li>The Caveats of Condition Variables<\/li>\n<\/ul>\n<\/li>\n<li class=\"_3nmeicAGQ4cByh_i8bPFBh\">\n<h3 class=\"_3cqdxhUVTb9hlTjlKaCzKD\"><span class=\"ez-toc-section\" id=\"Multithreading_Tasks\"><\/span>Multithreading: Tasks<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul class=\"_2IEo3eLPKRdVWEgf5J0f-p\">\n<li>Introduction to Tasks<\/li>\n<li>Threads vs Tasks<\/li>\n<li>Introduction to<span style=\"font-family: courier new, courier;\"> std::async<\/span><\/li>\n<li>async: Start Policy<\/li>\n<li>async: Fire and Forget<\/li>\n<li>async: Concurrent Calculation<\/li>\n<li>Introduction to<span style=\"font-family: courier new, courier;\"> std::packaged_task<\/span><\/li>\n<li>Introduction to Promises and Futures<\/li>\n<li>Promise and Future: Return an Exception<\/li>\n<li>Promise and Future: Return a Notification<\/li>\n<li>Introduction to <span style=\"font-family: courier new, courier;\">std::shared_future<\/span><\/li>\n<\/ul>\n<\/li>\n<li class=\"_3nmeicAGQ4cByh_i8bPFBh\">\n<h3 class=\"_3cqdxhUVTb9hlTjlKaCzKD\"><span class=\"ez-toc-section\" id=\"Case_Study_Calculate_Sum_of_a_Vector\"><\/span>Case Study: Calculate Sum of a Vector<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul class=\"_2IEo3eLPKRdVWEgf5J0f-p\">\n<li>Introduction<\/li>\n<li>Single Threaded Summation: Ranged Based for Loops<\/li>\n<li>Single Threaded Summation: Addition with std::accumulate<\/li>\n<li>Single Threaded Summation: Protection with Locks<\/li>\n<li>Single Threaded Summation: Protection with Atomics<\/li>\n<li>Multithreaded Summation: Using<span style=\"font-family: courier new, courier;\"> std::lock_guard<\/span><\/li>\n<li>Multithreaded Summation: Using Atomic Variable<\/li>\n<li>Multithreaded Summation: Using <span style=\"font-family: courier new, courier;\">fetch_add<\/span> Method<\/li>\n<li>Multithreaded Summation: Using<span style=\"font-family: courier new, courier;\"> fetch_add<\/span> Method with Relaxed Semantic<\/li>\n<li>Thread Local Summation: Using Local Variable<\/li>\n<li>Thread Local Summation: Using an Atomic Variable with Sequential Consistency<\/li>\n<li>Thread Local Summation: Using an Atomic Variable with Relaxed Semantic<\/li>\n<li>Thread Local Summation: Using Thread Local Data<\/li>\n<li>Thread Local Summation: Using Tasks<\/li>\n<li>Calculate Sum of a Vector: Conclusion<\/li>\n<\/ul>\n<\/li>\n<li class=\"_3nmeicAGQ4cByh_i8bPFBh\">\n<h3 class=\"_3cqdxhUVTb9hlTjlKaCzKD\"><span class=\"ez-toc-section\" id=\"Case_Study_Thread-Safe_Initialization_of_a_Singleton\"><\/span>Case Study: Thread-Safe Initialization of a Singleton<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul class=\"_2IEo3eLPKRdVWEgf5J0f-p\">\n<li>Introduction<\/li>\n<li><a href=\"https:\/\/www.educative.io\/collection\/page\/10370001\/5731772033662976\/5691821153845248\" class=\"_3vWNGgXD8bGOnBLQBSjs4t\">Double Checked Locking Pattern<span class=\"_1WCF_LT6u3qGl2MXXlPev1\">Preview<\/span><\/a><\/li>\n<li>Performance Measurement<\/li>\n<li>Classical Meyers Singleton<\/li>\n<li>Introduction to Thread Safe Meyers Singleton<\/li>\n<li>Thread Safe Singleton: <span style=\"font-family: courier new, courier;\">std::lock_guard<\/span><\/li>\n<li>Thread Safe Singleton: <span style=\"font-family: courier new, courier;\">std::call_once<\/span> with <span style=\"font-family: courier new, courier;\">std::once_flag<\/span><\/li>\n<li>Thread Safe Singleton: Atomics<\/li>\n<li>Conclusion<\/li>\n<\/ul>\n<\/li>\n<li class=\"_3nmeicAGQ4cByh_i8bPFBh\">\n<h3 class=\"_3cqdxhUVTb9hlTjlKaCzKD\"><span class=\"ez-toc-section\" id=\"Case_Study_Ongoing_Optimization_with_CppMem\"><\/span>Case Study: Ongoing Optimization with CppMem<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul class=\"_2IEo3eLPKRdVWEgf5J0f-p\">\n<li>Introduction to CppMem<\/li>\n<li>CppMem: An Overview<\/li>\n<li>CppMem: Non-Atomic Variables<\/li>\n<li>CppMem: Locks<\/li>\n<li>CppMem: Atomics with Sequential Consistency<\/li>\n<li>CppMem: Atomics with Acquire Release Semantic<\/li>\n<li>CppMem: Atomics with Non-Atomics<\/li>\n<li>CppMem: Atomics with Relaxed Semantic<\/li>\n<li>Conclusion<\/li>\n<\/ul>\n<\/li>\n<li class=\"_3nmeicAGQ4cByh_i8bPFBh\">\n<h3 class=\"_3cqdxhUVTb9hlTjlKaCzKD\"><span class=\"ez-toc-section\" id=\"Parallel_Algorithms_of_the_Standard_Template_Library\"><\/span>Parallel Algorithms of the Standard Template Library<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul class=\"_2IEo3eLPKRdVWEgf5J0f-p\">\n<li>Execution Policies<\/li>\n<li>Parallel &amp; Vectorized Execution<\/li>\n<li>Algorithms<\/li>\n<li>The New Algorithms<\/li>\n<li>New Algorithms &#8211; A Functional Perspective<\/li>\n<\/ul>\n<\/li>\n<li class=\"_3nmeicAGQ4cByh_i8bPFBh\">\n<h3 class=\"_3cqdxhUVTb9hlTjlKaCzKD\"><span class=\"ez-toc-section\" id=\"The_Future_C20\"><\/span>The Future: C++20<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul class=\"_2IEo3eLPKRdVWEgf5J0f-p\">\n<li>Atomic Smart Pointers<\/li>\n<li>Thread-Safe Linked List Using Atomic Pointers<\/li>\n<li>Introduction to Extended Futures<\/li>\n<li>Attaching Extended Futures<\/li>\n<li>Creating New Futures<\/li>\n<li>Latches and Barriers<\/li>\n<li>Transactional Memory &#8211; An Overview<\/li>\n<li>The Two Flavors of Transactional Memory<\/li>\n<li>Introduction to Coroutines<\/li>\n<li>Coroutines: More Details<\/li>\n<li>Task Blocks<\/li>\n<\/ul>\n<\/li>\n<li class=\"_3nmeicAGQ4cByh_i8bPFBh\">\n<h3 class=\"_3cqdxhUVTb9hlTjlKaCzKD\"><span class=\"ez-toc-section\" id=\"Coding_Examples\"><\/span>Coding Examples<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul class=\"_2IEo3eLPKRdVWEgf5J0f-p\">\n<li>ABA<\/li>\n<li>Blocking Issues<\/li>\n<li>Breaking of Program Invariants<\/li>\n<li>Data Races<\/li>\n<li>False Sharing<\/li>\n<li>Lifetime Issues of Variables<\/li>\n<li>Moving Threads<\/li>\n<li>Deadlocks<\/li>\n<li>Race Conditions<\/li>\n<\/ul>\n<\/li>\n<li class=\"_3nmeicAGQ4cByh_i8bPFBh\">\n<h3 class=\"_3cqdxhUVTb9hlTjlKaCzKD\"><span class=\"ez-toc-section\" id=\"Best_Practices\"><\/span>Best Practices<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul class=\"_2IEo3eLPKRdVWEgf5J0f-p\">\n<li>General<\/li>\n<li>Memory Model<\/li>\n<li>Multithreading: Threads<\/li>\n<li>Multithreading: Shared Data<\/li>\n<li>Multithreading: Condition Variables<\/li>\n<\/ul>\n<\/li>\n<li class=\"_3nmeicAGQ4cByh_i8bPFBh\">\n<h3 class=\"_3cqdxhUVTb9hlTjlKaCzKD\"><span class=\"ez-toc-section\" id=\"The_Time_Library\"><\/span>The Time Library<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul class=\"_2IEo3eLPKRdVWEgf5J0f-p\">\n<li>The Interplay of Time Point, Time Duration, and Clock<\/li>\n<li>Time Point<\/li>\n<li>From Time Point to Calendar Time<\/li>\n<li>Time Duration<\/li>\n<li>Time Duration Calculations<\/li>\n<li>Clocks<\/li>\n<li>Sleep and Wait<\/li>\n<\/ul>\n<\/li>\n<li class=\"_3nmeicAGQ4cByh_i8bPFBh\">\n<h3 class=\"_3cqdxhUVTb9hlTjlKaCzKD\"><span class=\"ez-toc-section\" id=\"Glossary\"><\/span>Glossary<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul class=\"_2IEo3eLPKRdVWEgf5J0f-p\">\n<li>Glossary<\/li>\n<li>Running Source Code on your own machine<\/li>\n<\/ul>\n<\/li>\n<li class=\"_3nmeicAGQ4cByh_i8bPFBh\">\n<h3 class=\"_3cqdxhUVTb9hlTjlKaCzKD\"><span class=\"ez-toc-section\" id=\"About_the_Author\"><\/span>About the Author<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul class=\"_2IEo3eLPKRdVWEgf5J0f-p\">\n<li>Personal Notes<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p>Modernes C++,<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\" size-full wp-image-4721\" src=\"https:\/\/www.modernescpp.com\/wp-content\/uploads\/2016\/04\/RainerGrimmSmall.png\" alt=\"RainerGrimmSmall\" width=\"222\" height=\"66\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Based on my book &#8220;Concurrency with Modern C++&#8221; educative.io created an interactive course. You can have it now at a discount of 38 %. &#8220;Modern C++ Concurrency&#8221; is an interactive journey through current and upcoming concurrency in C++. C++11 and C++14 have the basic building blocks for creating concurrent or parallel programs. With C++17 we [&hellip;]<\/p>\n","protected":false},"author":21,"featured_media":5294,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[360],"tags":[],"class_list":["post-5481","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-news"],"_links":{"self":[{"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/posts\/5481","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/users\/21"}],"replies":[{"embeddable":true,"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/comments?post=5481"}],"version-history":[{"count":0,"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/posts\/5481\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/media\/5294"}],"wp:attachment":[{"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/media?parent=5481"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/categories?post=5481"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/tags?post=5481"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}