{"id":8052,"date":"2025-11-29T09:17:49","date_gmt":"2025-11-29T08:17:49","guid":{"rendered":"https:\/\/web-dev-weissblau.de\/microconsult\/?p=8052"},"modified":"2026-02-11T06:21:47","modified_gmt":"2026-02-11T05:21:47","slug":"c11-14-multithreading","status":"publish","type":"post","link":"https:\/\/www.microconsult.de\/en\/c11-14-multithreading\/","title":{"rendered":"C++11\/14 Multithreading"},"content":{"rendered":"<h2>Overview, highlights and pitfalls<\/h2>\n<p>Author: Karl Nieratschker, SKT Nieratschker<\/p>\n<h3>Contribution \u2013 Embedded Software Engineering Congress 2015<\/h3>\n<p><strong>Since the introduction of C++11, the C++ standard library has also offered support for developing multithreaded applications. This functionality has been further expanded in the latest standard, C++14. While using the C++ Multithread API simplifies the porting of such applications, it also means that developers are limited to the capabilities of the standard library if they want to benefit from its features. Therefore, not only when developing new applications, but also for existing applications that still rely on platform-specific multithreading solutions, the question arises whether it makes sense to use or migrate to this API. This presentation provides an overview of the capabilities of the C++ Multithread API and shows what needs to be considered when porting applications.<\/strong><\/p>\n<p>When designing the C++11 multithreaded standard library, many elements were adopted from the widely used C++ Boost library, and additional functionalities were added. However, those familiar with Boost should note that not everything was adopted, and the adopted features were not always implemented exactly the same way. The library&#039;s implementation made extensive use of new C++11 language features, such as variadic templates, rvalue references, and lambda functions.<\/p>\n<h2>The thread class and its possibilities<\/h2>\n<p>A thread is represented by an instance of the `thread` class. When creating this instance, the code to be executed by the thread can be specified as a global function, an instance or class method, a functor, or a lambda function. The constructor creates a runtime thread that can execute the code immediately. The destructor of the `thread` class checks whether the associated runtime thread is still running and throws an exception if necessary. To prevent this, you can either wait for the thread to finish using the `join()` method or detach the runtime thread from the C++ thread object using the `detach()` method. The thread function to be executed can have any number of parameters of any type, which are always implicitly copied to ensure a sufficiently long lifetime (Figure 1, see...).\u00a0<a title=\"C++11\/14 Multithreading (PDF)\" href=\"https:\/\/www.microconsult.de\/wp-content\/uploads\/2025\/11\/fachinfo_ese_implementierung_c11-14_multithreading_skt_nieratschker_nieratschker.pdf\" target=\"_blank\" rel=\"noopener\">PDF<\/a>).<\/p>\n<p>Each thread has an ID of type `thread::id` for identification. Since the ID is platform-specific, this type supports only a few operations, such as `get_id()` as a method of the `thread` class and as a function of the `this_thread` namespace, as well as comparison operators. Other functions of the `this_thread` namespace include `sleep_for()` and `sleep_until()`, which allow a thread to sleep for a relative or absolute time, respectively, and the `yield()` function, which releases the remainder of a thread&#039;s time slice. Thread-local memory is also supported in C++11, but in a much more intuitive way than in Boost. Finally, the static method `hardware_concurrency()` returns the number of currently available hardware execution units (cores). However, this function can also return zero, so the value it returns should only be considered indicative.<\/p>\n<h2 class=\"Default\">synchronization<\/h2>\n<p>To protect resources, C++11 supports not only &quot;normal&quot; mutexes of type `mutex`, but also those that can be requested multiple times (non-blocking) by a thread (`recursive_mutex`) and those that return an error if the mutex cannot be requested within a certain time (`timed_mutex`, `recursive_timed_mutex`). With C++14, Boost&#039;s `shared_mutex` was also incorporated into the standard as `shared_timed_mutex` for multiple-reader\/single-writer applications. The classes `lock_guard`, `unique_lock`, and `shared_lock` (C++14) reliably prevent deadlock problems caused by missing mutex releases (Figure 2, see...).\u00a0<a title=\"C++11\/14 Multithreading (PDF)\" href=\"https:\/\/www.microconsult.de\/wp-content\/uploads\/2025\/11\/fachinfo_ese_implementierung_c11-14_multithreading_skt_nieratschker_nieratschker.pdf\" target=\"_blank\" rel=\"noopener\">PDF<\/a>).<\/p>\n<p>One of the biggest highlights of the C++11 multithreaded library is Atomics. With their help, standard data types such as int or float can be declared as atomic. The operations on a variable of type atomic (or atomic_int for C programs) are indivisible and therefore no longer need to be explicitly protected, e.g., by a mutex (Figure 3, see\u00a0<a title=\"C++11\/14 Multithreading (PDF)\" href=\"https:\/\/www.microconsult.de\/wp-content\/uploads\/2025\/11\/fachinfo_ese_implementierung_c11-14_multithreading_skt_nieratschker_nieratschker.pdf\" target=\"_blank\" rel=\"noopener\">PDF<\/a>).<\/p>\n<p>Furthermore, a new memory model was introduced, which allows classic multithreading problems caused by compiler or processor optimizations to be reliably solved using memory barriers and atomic variables. In addition, atomics, with their `compare_exchange` methods, create the prerequisites for lock-free programming. With the exception of the `atomic_flag` data type, the standard does not guarantee that the operations of an atomic data type are lock-free. However, this can be checked using the `is_lock_free()` method. In principle, it is even possible to define custom atomic data types.<\/p>\n<p>For event synchronization, C++11 provides condition variables. Using the `wait` method of the condition variable, a thread can wait for a condition to be met. If another thread executes code that meets the condition, the `notify_one` method of the condition variable must be called after the execution of that code to wake the waiting thread. `notify_all` can even wake multiple waiting threads simultaneously. In any case, after returning from the wait state, a thread must re-examine the condition, as the runtime system might wake the thread for other reasons as well.<\/p>\n<p>Finally, the `call_once` function ensures that a function is only executed once, regardless of how often or by how many threads it is called. This is typically needed in the context of initializations.<\/p>\n<h2>Futures<\/h2>\n<p>The return value of a C++11 thread function cannot be used to provide a result, as is the case with many other multithreading platforms. Instead, an object of type `future` must be used. It can be used to temporarily store the result if the receiving thread is not yet ready, or to block the receiving thread if the result is not yet available. There are three different uses for it.<\/p>\n<p>The application variant with the lowest level of abstraction consists of a promise The process creates a Future object and makes it available to the thread that determines the result, which it then passes to the Promise object using the `set_value()` method. The receiver obtains a Future object using the Promise object&#039;s `get_future()` method. After completing any necessary parallel operations, it can then access the result using the Future object&#039;s `get()` method, blocking if required until the result is available.<\/p>\n<p>At the next higher level of abstraction, a `packaged_task` object is created and parameterized with a function that returns the result as a normal return value. The `get_future` method of the `Task` object then returns the corresponding `Future` object. To achieve concurrency, a thread must again be created and parameterized with the `Task` object. The result is passed as in the first solution.<\/p>\n<p>At the highest level of abstraction, only the `async` function specifies the code of the function that returns the calculated result using a normal return value. Whether the function is executed asynchronously in its own thread or synchronously in the context of the thread requesting the result can be left to the runtime system or determined using a parameter. `async` returns the Future object directly as a return value (Figure 4, see...).\u00a0<a title=\"C++11\/14 Multithreading (PDF)\" href=\"https:\/\/www.microconsult.de\/wp-content\/uploads\/2025\/11\/fachinfo_ese_implementierung_c11-14_multithreading_skt_nieratschker_nieratschker.pdf\" target=\"_blank\" rel=\"noopener\">PDF<\/a>).<\/p>\n<p>The result of a future The object can only be read once. If multiple threads require the same result, then `shared_future` must be used. -objects are worked on.<\/p>\n<h2 class=\"Default\">Things that the standard does not support<\/h2>\n<p>Unlike, for example, the POSIX\/Pthread standard, the C++11\/14 multithreading API does not offer a direct way to assign different priorities to threads or to create mutexes with priority inheritance or ceiling priority. This is a significant limitation, especially for use in real-time systems. While it is possible to obtain the handle of the corresponding runtime thread using the `native_handle()` method of the `thread` class and use it to set the thread&#039;s priority at the operating system level, this approach compromises portability and does not solve the problem of priority inversion.<\/p>\n<p>Furthermore, C++11\/14 lacks support for asynchronously interrupting or terminating a thread. While the associated complexity generally necessitates avoiding these features, this is often difficult in practice. The POSIX\/Pthread standard offers good support in this area as well.<\/p>\n<p>Other things that those familiar with other multithreading solutions might miss in C++11\/14 include, for example, general (counting) semaphores, as well as efficient event flag mechanisms for signaling pure events where no data access needs to be synchronized.<\/p>\n<h2 class=\"Default\">Things to consider during the porting process<\/h2>\n<p>When porting multithreaded applications, it&#039;s crucial to be aware that the scheduling mechanisms of different platforms can vary significantly in detail. This applies not only to the scheduler&#039;s thread allocation behavior but also, for example, to the fairness of synchronization objects. While some aspects might be too slow, which is particularly problematic for real-time systems, a ported application should, in principle, function on any supported platform without modification. If this isn&#039;t the case, it&#039;s often because the design implicitly assumed that certain characteristics of the original platform were always present.<\/p>\n<p>Sometimes, porting problems stem from the fact that the standard has been implemented differently by compiler vendors. Aside from actual implementation errors, this can also be due to the standard not specifying everything down to the last detail. For example, if a mutex is released by a thread that doesn&#039;t actually own the mutex, the response depends on the implementation. For instance, GCC 4.9.2 on Linux executes the operation, while Visual Studio 2015 on Windows throws an exception (see Figure 5).\u00a0<a title=\"C++11\/14 Multithreading (PDF)\" href=\"https:\/\/www.microconsult.de\/wp-content\/uploads\/2025\/11\/fachinfo_ese_implementierung_c11-14_multithreading_skt_nieratschker_nieratschker.pdf\" target=\"_blank\" rel=\"noopener\">PDF<\/a>).<\/p>\n<h2>Reference<\/h2>\n<p><strong>\u201eC++ Concurrency in Action\u201c<\/strong>, Anthony Williams<\/p>\n<p><a title=\"C++11\/14 Multithreading (PDF)\" href=\"https:\/\/www.microconsult.de\/wp-content\/uploads\/2025\/11\/fachinfo_ese_implementierung_c11-14_multithreading_skt_nieratschker_nieratschker.pdf\" target=\"_blank\" rel=\"noopener\"><strong>Download the article as a PDF<\/strong><\/a><\/p>\n<hr \/>\n<h2>Implementation \u2013 our training &amp; coaching<\/h2>\n<p><strong>Do you want to bring yourself up to date with the latest technology?<\/strong><\/p>\n<p>Then find out more\u00a0<a title=\"MicroConsult Training\" href=\"https:\/\/www.microconsult.de\/en\/all-training-dates-complete-overview\/\" target=\"_blank\" rel=\"noopener\"><strong>here<\/strong>\u00a0<\/a>MircoConsult offers training courses\/seminars\/workshops and individual coaching on the topic of implementation\/embedded and real-time software development.<\/p>\n<p><strong>Training &amp; coaching on the other topics in our portfolio can be found here.\u00a0<a title=\"Training &amp; Consulting - all topics\" href=\"https:\/\/www.microconsult.de\/en\/training-beratung\/\" target=\"_blank\" rel=\"noopener\">here<\/a>.<\/strong><\/p>\n<hr \/>\n<h2>Implementation \u2013 Expertise<\/h2>\n<p>Valuable expertise in the field of implementation\/embedded and real-time software development is available.\u00a0<a title=\"Embedded and Real-Time Software Engineering\" href=\"https:\/\/www.microconsult.de\/en\/embedded-and-real-time-software-development\/\" target=\"_blank\" rel=\"noopener\"><strong>here\u00a0<\/strong><\/a>Available for you to download free of charge.<\/p>\n<p><a title=\"Embedded and Real-Time Software Engineering\" href=\"https:\/\/www.microconsult.de\/en\/embedded-and-real-time-software-development\/\" target=\"_blank\" rel=\"noopener\"><strong>To the specialist information<\/strong><\/a><\/p>\n<p><strong>You can find expertise on other topics in our portfolio here. <a title=\"MicroConsult Expertise\" href=\"https:\/\/www.microconsult.de\/en\/specialist-knowledge\/\" target=\"_blank\" rel=\"noopener\">here<\/a>.<\/strong><\/p>","protected":false},"excerpt":{"rendered":"<p>\u00dcberblick, Highlights und Fallstricke Autor: Karl Nieratschker, SKT Nieratschker Beitrag &#8211; Embedded Software Engineering Kongress 2015 Seit der Einf\u00fchrung von C++11 bietet die Standardbibliothek von C++ auch Unterst\u00fctzung f\u00fcr die Entwicklung von Multithread-Applikationen. Im neuesten Standard C++14 wurde diese Funktionalit\u00e4t sogar noch erweitert. Die Verwendung des C++-Multithread-APIs vereinfacht zwar die Portierung derartiger Anwendungen, f\u00fchrt aber [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_et_pb_use_builder":"","_et_pb_old_content":"","_et_gb_content_width":"","inline_featured_image":false,"footnotes":""},"categories":[],"tags":[],"class_list":["post-8052","post","type-post","status-publish","format-standard","hentry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.9 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>C++11\/14 Multithreading - MicroConsult Academy GmbH<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.microconsult.de\/en\/c11-14-multithreading\/\" \/>\n<meta property=\"og:locale\" content=\"en_GB\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"C++11\/14 Multithreading - MicroConsult Academy GmbH\" \/>\n<meta property=\"og:description\" content=\"\u00dcberblick, Highlights und Fallstricke Autor: Karl Nieratschker, SKT Nieratschker Beitrag &#8211; Embedded Software Engineering Kongress 2015 Seit der Einf\u00fchrung von C++11 bietet die Standardbibliothek von C++ auch Unterst\u00fctzung f\u00fcr die Entwicklung von Multithread-Applikationen. Im neuesten Standard C++14 wurde diese Funktionalit\u00e4t sogar noch erweitert. Die Verwendung des C++-Multithread-APIs vereinfacht zwar die Portierung derartiger Anwendungen, f\u00fchrt aber [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.microconsult.de\/en\/c11-14-multithreading\/\" \/>\n<meta property=\"og:site_name\" content=\"MicroConsult Academy GmbH\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-29T08:17:49+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-02-11T05:21:47+00:00\" \/>\n<meta name=\"author\" content=\"weissblau media\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"weissblau media\" \/>\n\t<meta name=\"twitter:label2\" content=\"Estimated reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/c11-14-multithreading\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/c11-14-multithreading\\\/\"},\"author\":{\"name\":\"weissblau media\",\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/#\\\/schema\\\/person\\\/b6d4c4ae959b068fbe8d9416ed019a0a\"},\"headline\":\"C++11\\\/14 Multithreading\",\"datePublished\":\"2025-11-29T08:17:49+00:00\",\"dateModified\":\"2026-02-11T05:21:47+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/c11-14-multithreading\\\/\"},\"wordCount\":1658,\"commentCount\":0,\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.microconsult.de\\\/c11-14-multithreading\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/c11-14-multithreading\\\/\",\"url\":\"https:\\\/\\\/www.microconsult.de\\\/c11-14-multithreading\\\/\",\"name\":\"C++11\\\/14 Multithreading - MicroConsult Academy GmbH\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/#website\"},\"datePublished\":\"2025-11-29T08:17:49+00:00\",\"dateModified\":\"2026-02-11T05:21:47+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/#\\\/schema\\\/person\\\/b6d4c4ae959b068fbe8d9416ed019a0a\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/c11-14-multithreading\\\/#breadcrumb\"},\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.microconsult.de\\\/c11-14-multithreading\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/c11-14-multithreading\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.microconsult.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"C++11\\\/14 Multithreading\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/#website\",\"url\":\"https:\\\/\\\/www.microconsult.de\\\/\",\"name\":\"MicroConsult Academy GmbH\",\"description\":\"Professionelle Schulungen, Beratung und Projektunterst\u00fctzung\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.microconsult.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-GB\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/#\\\/schema\\\/person\\\/b6d4c4ae959b068fbe8d9416ed019a0a\",\"name\":\"weissblau media\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/bbb409da4970da9446f6c49465d453cb8a0dae301e4d4f465b5c4e62408daa2e?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/bbb409da4970da9446f6c49465d453cb8a0dae301e4d4f465b5c4e62408daa2e?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/bbb409da4970da9446f6c49465d453cb8a0dae301e4d4f465b5c4e62408daa2e?s=96&d=mm&r=g\",\"caption\":\"weissblau media\"},\"sameAs\":[\"https:\\\/\\\/www.microconsult.de\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"C++11\/14 Multithreading - MicroConsult Academy GmbH","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.microconsult.de\/en\/c11-14-multithreading\/","og_locale":"en_GB","og_type":"article","og_title":"C++11\/14 Multithreading - MicroConsult Academy GmbH","og_description":"\u00dcberblick, Highlights und Fallstricke Autor: Karl Nieratschker, SKT Nieratschker Beitrag &#8211; Embedded Software Engineering Kongress 2015 Seit der Einf\u00fchrung von C++11 bietet die Standardbibliothek von C++ auch Unterst\u00fctzung f\u00fcr die Entwicklung von Multithread-Applikationen. Im neuesten Standard C++14 wurde diese Funktionalit\u00e4t sogar noch erweitert. Die Verwendung des C++-Multithread-APIs vereinfacht zwar die Portierung derartiger Anwendungen, f\u00fchrt aber [&hellip;]","og_url":"https:\/\/www.microconsult.de\/en\/c11-14-multithreading\/","og_site_name":"MicroConsult Academy GmbH","article_published_time":"2025-11-29T08:17:49+00:00","article_modified_time":"2026-02-11T05:21:47+00:00","author":"weissblau media","twitter_card":"summary_large_image","twitter_misc":{"Written by":"weissblau media","Estimated reading time":"9 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.microconsult.de\/c11-14-multithreading\/#article","isPartOf":{"@id":"https:\/\/www.microconsult.de\/c11-14-multithreading\/"},"author":{"name":"weissblau media","@id":"https:\/\/www.microconsult.de\/#\/schema\/person\/b6d4c4ae959b068fbe8d9416ed019a0a"},"headline":"C++11\/14 Multithreading","datePublished":"2025-11-29T08:17:49+00:00","dateModified":"2026-02-11T05:21:47+00:00","mainEntityOfPage":{"@id":"https:\/\/www.microconsult.de\/c11-14-multithreading\/"},"wordCount":1658,"commentCount":0,"inLanguage":"en-GB","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.microconsult.de\/c11-14-multithreading\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.microconsult.de\/c11-14-multithreading\/","url":"https:\/\/www.microconsult.de\/c11-14-multithreading\/","name":"C++11\/14 Multithreading - MicroConsult Academy GmbH","isPartOf":{"@id":"https:\/\/www.microconsult.de\/#website"},"datePublished":"2025-11-29T08:17:49+00:00","dateModified":"2026-02-11T05:21:47+00:00","author":{"@id":"https:\/\/www.microconsult.de\/#\/schema\/person\/b6d4c4ae959b068fbe8d9416ed019a0a"},"breadcrumb":{"@id":"https:\/\/www.microconsult.de\/c11-14-multithreading\/#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.microconsult.de\/c11-14-multithreading\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.microconsult.de\/c11-14-multithreading\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.microconsult.de\/"},{"@type":"ListItem","position":2,"name":"C++11\/14 Multithreading"}]},{"@type":"WebSite","@id":"https:\/\/www.microconsult.de\/#website","url":"https:\/\/www.microconsult.de\/","name":"MicroConsult Academy GmbH","description":"Professional training, consulting and project support","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.microconsult.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-GB"},{"@type":"Person","@id":"https:\/\/www.microconsult.de\/#\/schema\/person\/b6d4c4ae959b068fbe8d9416ed019a0a","name":"weissblau media","image":{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/secure.gravatar.com\/avatar\/bbb409da4970da9446f6c49465d453cb8a0dae301e4d4f465b5c4e62408daa2e?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/bbb409da4970da9446f6c49465d453cb8a0dae301e4d4f465b5c4e62408daa2e?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/bbb409da4970da9446f6c49465d453cb8a0dae301e4d4f465b5c4e62408daa2e?s=96&d=mm&r=g","caption":"weissblau media"},"sameAs":["https:\/\/www.microconsult.de"]}]}},"post_mailing_queue_ids":[],"_links":{"self":[{"href":"https:\/\/www.microconsult.de\/en\/wp-json\/wp\/v2\/posts\/8052","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.microconsult.de\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.microconsult.de\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.microconsult.de\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.microconsult.de\/en\/wp-json\/wp\/v2\/comments?post=8052"}],"version-history":[{"count":6,"href":"https:\/\/www.microconsult.de\/en\/wp-json\/wp\/v2\/posts\/8052\/revisions"}],"predecessor-version":[{"id":11629,"href":"https:\/\/www.microconsult.de\/en\/wp-json\/wp\/v2\/posts\/8052\/revisions\/11629"}],"wp:attachment":[{"href":"https:\/\/www.microconsult.de\/en\/wp-json\/wp\/v2\/media?parent=8052"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.microconsult.de\/en\/wp-json\/wp\/v2\/categories?post=8052"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.microconsult.de\/en\/wp-json\/wp\/v2\/tags?post=8052"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}