{"id":19325,"date":"2024-03-15T18:42:12","date_gmt":"2024-03-15T18:42:12","guid":{"rendered":"https:\/\/www.silicloud.com\/blog\/what-is-the-method-of-using-a-thread-pool-in-c\/"},"modified":"2024-03-21T15:25:54","modified_gmt":"2024-03-21T15:25:54","slug":"what-is-the-method-of-using-a-thread-pool-in-c","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/blog\/what-is-the-method-of-using-a-thread-pool-in-c\/","title":{"rendered":"What is the method of using a thread pool in C++?"},"content":{"rendered":"<p>In C++, using a thread pool typically involves the following steps:<\/p>\n<ol>\n<li>conversation<\/li>\n<li>Create a class for a thread pool that consists of a thread pool container and a task queue.<\/li>\n<li>Define a task class that includes a function pointer and function parameters.<\/li>\n<li>Define a method in the ThreadPool class to add tasks to the task queue.<\/li>\n<li>Define a method in the thread pool class to execute tasks, which retrieves tasks from the task queue and performs them.<\/li>\n<li>Create a thread pool object in the main function and call the method to add tasks to it.<\/li>\n<li>By calling the method to start the execution of tasks in the thread pool object, the added tasks will be automatically executed by the thread pool.<\/li>\n<\/ol>\n<p>Here is a simple example code of a thread pool in C++.<\/p>\n<pre class=\"post-pre\"><code><span class=\"hljs-meta\">#<span class=\"hljs-keyword\">include<\/span> <span class=\"hljs-string\">&lt;iostream&gt;<\/span><\/span>\r\n<span class=\"hljs-meta\">#<span class=\"hljs-keyword\">include<\/span> <span class=\"hljs-string\">&lt;vector&gt;<\/span><\/span>\r\n<span class=\"hljs-meta\">#<span class=\"hljs-keyword\">include<\/span> <span class=\"hljs-string\">&lt;thread&gt;<\/span><\/span>\r\n<span class=\"hljs-meta\">#<span class=\"hljs-keyword\">include<\/span> <span class=\"hljs-string\">&lt;queue&gt;<\/span><\/span>\r\n<span class=\"hljs-meta\">#<span class=\"hljs-keyword\">include<\/span> <span class=\"hljs-string\">&lt;functional&gt;<\/span><\/span>\r\n\r\n<span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title class_\">ThreadPool<\/span> {\r\n<span class=\"hljs-keyword\">public<\/span>:\r\n    <span class=\"hljs-built_in\">ThreadPool<\/span>(<span class=\"hljs-type\">int<\/span> numThreads) : <span class=\"hljs-built_in\">stop<\/span>(<span class=\"hljs-literal\">false<\/span>) {\r\n        <span class=\"hljs-keyword\">for<\/span> (<span class=\"hljs-type\">int<\/span> i = <span class=\"hljs-number\">0<\/span>; i &lt; numThreads; ++i) {\r\n            threads.<span class=\"hljs-built_in\">emplace_back<\/span>(std::<span class=\"hljs-built_in\">bind<\/span>(&amp;ThreadPool::worker, <span class=\"hljs-keyword\">this<\/span>));\r\n        }\r\n    }\r\n\r\n    <span class=\"hljs-keyword\">template<\/span> &lt;<span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title class_\">F<\/span>, <span class=\"hljs-keyword\">class<\/span>... Args&gt;\r\n    <span class=\"hljs-function\"><span class=\"hljs-type\">void<\/span> <span class=\"hljs-title\">addTask<\/span><span class=\"hljs-params\">(F&amp;&amp; f, Args&amp;&amp;... args)<\/span> <\/span>{\r\n        tasks.<span class=\"hljs-built_in\">emplace<\/span>(std::<span class=\"hljs-built_in\">bind<\/span>(std::forward&lt;F&gt;(f), std::forward&lt;Args&gt;(args)...));\r\n    }\r\n\r\n    ~<span class=\"hljs-built_in\">ThreadPool<\/span>() {\r\n        {\r\n            <span class=\"hljs-function\">std::unique_lock&lt;std::mutex&gt; <span class=\"hljs-title\">lock<\/span><span class=\"hljs-params\">(mutex)<\/span><\/span>;\r\n            stop = <span class=\"hljs-literal\">true<\/span>;\r\n        }\r\n        condition.<span class=\"hljs-built_in\">notify_all<\/span>();\r\n        <span class=\"hljs-keyword\">for<\/span> (<span class=\"hljs-keyword\">auto<\/span>&amp; thread : threads) {\r\n            thread.<span class=\"hljs-built_in\">join<\/span>();\r\n        }\r\n    }\r\n\r\n<span class=\"hljs-keyword\">private<\/span>:\r\n    std::vector&lt;std::thread&gt; threads;\r\n    std::queue&lt;std::function&lt;<span class=\"hljs-type\">void<\/span>()&gt;&gt; tasks;\r\n    std::mutex mutex;\r\n    std::condition_variable condition;\r\n    <span class=\"hljs-type\">bool<\/span> stop;\r\n\r\n    <span class=\"hljs-function\"><span class=\"hljs-type\">void<\/span> <span class=\"hljs-title\">worker<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\r\n        <span class=\"hljs-keyword\">while<\/span> (<span class=\"hljs-literal\">true<\/span>) {\r\n            std::function&lt;<span class=\"hljs-type\">void<\/span>()&gt; task;\r\n            {\r\n                <span class=\"hljs-function\">std::unique_lock&lt;std::mutex&gt; <span class=\"hljs-title\">lock<\/span><span class=\"hljs-params\">(mutex)<\/span><\/span>;\r\n                condition.<span class=\"hljs-built_in\">wait<\/span>(lock, [<span class=\"hljs-keyword\">this<\/span>]() { <span class=\"hljs-keyword\">return<\/span> stop || !tasks.<span class=\"hljs-built_in\">empty<\/span>(); });\r\n                <span class=\"hljs-keyword\">if<\/span> (stop &amp;&amp; tasks.<span class=\"hljs-built_in\">empty<\/span>()) {\r\n                    <span class=\"hljs-keyword\">return<\/span>;\r\n                }\r\n                task = std::<span class=\"hljs-built_in\">move<\/span>(tasks.<span class=\"hljs-built_in\">front<\/span>());\r\n                tasks.<span class=\"hljs-built_in\">pop<\/span>();\r\n            }\r\n            <span class=\"hljs-built_in\">task<\/span>();\r\n        }\r\n    }\r\n};\r\n\r\n<span class=\"hljs-function\"><span class=\"hljs-type\">void<\/span> <span class=\"hljs-title\">printHello<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\r\n    std::cout &lt;&lt; <span class=\"hljs-string\">\"Hello\"<\/span> &lt;&lt; std::endl;\r\n}\r\n\r\n<span class=\"hljs-function\"><span class=\"hljs-type\">int<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\r\n    <span class=\"hljs-function\">ThreadPool <span class=\"hljs-title\">pool<\/span><span class=\"hljs-params\">(<span class=\"hljs-number\">4<\/span>)<\/span><\/span>;\r\n\r\n    <span class=\"hljs-keyword\">for<\/span> (<span class=\"hljs-type\">int<\/span> i = <span class=\"hljs-number\">0<\/span>; i &lt; <span class=\"hljs-number\">8<\/span>; ++i) {\r\n        pool.<span class=\"hljs-built_in\">addTask<\/span>(printHello);\r\n    }\r\n\r\n    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-number\">0<\/span>;\r\n}\r\n<\/code><\/pre>\n<p>In the above example, the ThreadPool class contains a ThreadPool container threads and a task queue tasks. Tasks can be added to the task queue by calling the addTask method. In the worker method, ThreadPool threads will continuously take tasks from the task queue and execute them. In the main function, a ThreadPool object with 4 threads is created and 8 tasks to print &#8220;Hello&#8221; are added.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In C++, using a thread pool typically involves the following steps: conversation Create a class for a thread pool that consists of a thread pool container and a task queue. Define a task class that includes a function pointer and function parameters. Define a method in the ThreadPool class to add tasks to the task [&hellip;]<\/p>\n","protected":false},"author":14,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"","footnotes":""},"categories":[1],"tags":[],"class_list":["post-19325","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v21.5 (Yoast SEO v21.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>What is the method of using a thread pool in C++? - Blog - Silicon Cloud<\/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.silicloud.com\/blog\/what-is-the-method-of-using-a-thread-pool-in-c\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"What is the method of using a thread pool in C++?\" \/>\n<meta property=\"og:description\" content=\"In C++, using a thread pool typically involves the following steps: conversation Create a class for a thread pool that consists of a thread pool container and a task queue. Define a task class that includes a function pointer and function parameters. Define a method in the ThreadPool class to add tasks to the task [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/blog\/what-is-the-method-of-using-a-thread-pool-in-c\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/SiliCloudGlobal\/\" \/>\n<meta property=\"article:published_time\" content=\"2024-03-15T18:42:12+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-03-21T15:25:54+00:00\" \/>\n<meta name=\"author\" content=\"Noah Thompson\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@SiliCloudGlobal\" \/>\n<meta name=\"twitter:site\" content=\"@SiliCloudGlobal\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Noah Thompson\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.silicloud.com\/blog\/what-is-the-method-of-using-a-thread-pool-in-c\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/blog\/what-is-the-method-of-using-a-thread-pool-in-c\/\"},\"author\":{\"name\":\"Noah Thompson\",\"@id\":\"https:\/\/www.silicloud.com\/blog\/#\/schema\/person\/2e83cc6ab9f60d36921c2d0f9f280f4a\"},\"headline\":\"What is the method of using a thread pool in C++?\",\"datePublished\":\"2024-03-15T18:42:12+00:00\",\"dateModified\":\"2024-03-21T15:25:54+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.silicloud.com\/blog\/what-is-the-method-of-using-a-thread-pool-in-c\/\"},\"wordCount\":209,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.silicloud.com\/blog\/#organization\"},\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.silicloud.com\/blog\/what-is-the-method-of-using-a-thread-pool-in-c\/\",\"url\":\"https:\/\/www.silicloud.com\/blog\/what-is-the-method-of-using-a-thread-pool-in-c\/\",\"name\":\"What is the method of using a thread pool in C++? - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/blog\/#website\"},\"datePublished\":\"2024-03-15T18:42:12+00:00\",\"dateModified\":\"2024-03-21T15:25:54+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/blog\/what-is-the-method-of-using-a-thread-pool-in-c\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/blog\/what-is-the-method-of-using-a-thread-pool-in-c\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/blog\/what-is-the-method-of-using-a-thread-pool-in-c\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.silicloud.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"What is the method of using a thread pool in C++?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.silicloud.com\/blog\/#website\",\"url\":\"https:\/\/www.silicloud.com\/blog\/\",\"name\":\"Silicon Cloud Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/www.silicloud.com\/blog\/#organization\"},\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.silicloud.com\/blog\/#organization\",\"name\":\"Silicon Cloud Blog\",\"url\":\"https:\/\/www.silicloud.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.silicloud.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.silicloud.com\/blog\/wp-content\/uploads\/2023\/11\/EN-SILICON-Full.png\",\"contentUrl\":\"https:\/\/www.silicloud.com\/blog\/wp-content\/uploads\/2023\/11\/EN-SILICON-Full.png\",\"width\":1024,\"height\":1024,\"caption\":\"Silicon Cloud Blog\"},\"image\":{\"@id\":\"https:\/\/www.silicloud.com\/blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/SiliCloudGlobal\/\",\"https:\/\/twitter.com\/SiliCloudGlobal\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.silicloud.com\/blog\/#\/schema\/person\/2e83cc6ab9f60d36921c2d0f9f280f4a\",\"name\":\"Noah Thompson\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.silicloud.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/350e537e1530ede2762ee0237e877d6693f4f7163ab4f303202cc9a6b27b6cb4?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/350e537e1530ede2762ee0237e877d6693f4f7163ab4f303202cc9a6b27b6cb4?s=96&d=mm&r=g\",\"caption\":\"Noah Thompson\"},\"url\":\"https:\/\/www.silicloud.com\/blog\/author\/noahthompson\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"What is the method of using a thread pool in C++? - Blog - Silicon Cloud","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.silicloud.com\/blog\/what-is-the-method-of-using-a-thread-pool-in-c\/","og_locale":"en_US","og_type":"article","og_title":"What is the method of using a thread pool in C++?","og_description":"In C++, using a thread pool typically involves the following steps: conversation Create a class for a thread pool that consists of a thread pool container and a task queue. Define a task class that includes a function pointer and function parameters. Define a method in the ThreadPool class to add tasks to the task [&hellip;]","og_url":"https:\/\/www.silicloud.com\/blog\/what-is-the-method-of-using-a-thread-pool-in-c\/","og_site_name":"Blog - Silicon Cloud","article_publisher":"https:\/\/www.facebook.com\/SiliCloudGlobal\/","article_published_time":"2024-03-15T18:42:12+00:00","article_modified_time":"2024-03-21T15:25:54+00:00","author":"Noah Thompson","twitter_card":"summary_large_image","twitter_creator":"@SiliCloudGlobal","twitter_site":"@SiliCloudGlobal","twitter_misc":{"Written by":"Noah Thompson","Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.silicloud.com\/blog\/what-is-the-method-of-using-a-thread-pool-in-c\/#article","isPartOf":{"@id":"https:\/\/www.silicloud.com\/blog\/what-is-the-method-of-using-a-thread-pool-in-c\/"},"author":{"name":"Noah Thompson","@id":"https:\/\/www.silicloud.com\/blog\/#\/schema\/person\/2e83cc6ab9f60d36921c2d0f9f280f4a"},"headline":"What is the method of using a thread pool in C++?","datePublished":"2024-03-15T18:42:12+00:00","dateModified":"2024-03-21T15:25:54+00:00","mainEntityOfPage":{"@id":"https:\/\/www.silicloud.com\/blog\/what-is-the-method-of-using-a-thread-pool-in-c\/"},"wordCount":209,"commentCount":0,"publisher":{"@id":"https:\/\/www.silicloud.com\/blog\/#organization"},"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/blog\/what-is-the-method-of-using-a-thread-pool-in-c\/","url":"https:\/\/www.silicloud.com\/blog\/what-is-the-method-of-using-a-thread-pool-in-c\/","name":"What is the method of using a thread pool in C++? - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/blog\/#website"},"datePublished":"2024-03-15T18:42:12+00:00","dateModified":"2024-03-21T15:25:54+00:00","breadcrumb":{"@id":"https:\/\/www.silicloud.com\/blog\/what-is-the-method-of-using-a-thread-pool-in-c\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/blog\/what-is-the-method-of-using-a-thread-pool-in-c\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/blog\/what-is-the-method-of-using-a-thread-pool-in-c\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.silicloud.com\/blog\/"},{"@type":"ListItem","position":2,"name":"What is the method of using a thread pool in C++?"}]},{"@type":"WebSite","@id":"https:\/\/www.silicloud.com\/blog\/#website","url":"https:\/\/www.silicloud.com\/blog\/","name":"Silicon Cloud Blog","description":"","publisher":{"@id":"https:\/\/www.silicloud.com\/blog\/#organization"},"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.silicloud.com\/blog\/#organization","name":"Silicon Cloud Blog","url":"https:\/\/www.silicloud.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.silicloud.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.silicloud.com\/blog\/wp-content\/uploads\/2023\/11\/EN-SILICON-Full.png","contentUrl":"https:\/\/www.silicloud.com\/blog\/wp-content\/uploads\/2023\/11\/EN-SILICON-Full.png","width":1024,"height":1024,"caption":"Silicon Cloud Blog"},"image":{"@id":"https:\/\/www.silicloud.com\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/SiliCloudGlobal\/","https:\/\/twitter.com\/SiliCloudGlobal"]},{"@type":"Person","@id":"https:\/\/www.silicloud.com\/blog\/#\/schema\/person\/2e83cc6ab9f60d36921c2d0f9f280f4a","name":"Noah Thompson","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.silicloud.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/350e537e1530ede2762ee0237e877d6693f4f7163ab4f303202cc9a6b27b6cb4?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/350e537e1530ede2762ee0237e877d6693f4f7163ab4f303202cc9a6b27b6cb4?s=96&d=mm&r=g","caption":"Noah Thompson"},"url":"https:\/\/www.silicloud.com\/blog\/author\/noahthompson\/"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/posts\/19325","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/users\/14"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/comments?post=19325"}],"version-history":[{"count":1,"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/posts\/19325\/revisions"}],"predecessor-version":[{"id":53062,"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/posts\/19325\/revisions\/53062"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/media?parent=19325"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/categories?post=19325"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/tags?post=19325"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}