{"id":27468,"date":"2022-12-24T15:03:29","date_gmt":"2022-12-24T09:33:29","guid":{"rendered":"https:\/\/jassweb.com\/solved\/solved-for-a-concurrent-download-handler-does-this-create-a-race-condition\/"},"modified":"2022-12-24T15:03:29","modified_gmt":"2022-12-24T09:33:29","slug":"solved-for-a-concurrent-download-handler-does-this-create-a-race-condition","status":"publish","type":"post","link":"https:\/\/jassweb.com\/solved\/solved-for-a-concurrent-download-handler-does-this-create-a-race-condition\/","title":{"rendered":"[Solved] For a concurrent download handler does this create a race condition?"},"content":{"rendered":"<p> [ad_1]<br \/>\n<\/p>\n<div id=\"answer-48456440\" class=\"answer js-answer accepted-answer js-accepted-answer\" data-answerid=\"48456440\" data-parentid=\"48449328\" data-score=\"-1\" data-position-on-page=\"2\" data-highest-scored=\"0\" data-question-has-accepted-highest-score=\"0\" itemprop=\"suggestedAnswer\" itemscope itemtype=\"https:\/\/schema.org\/Answer\">\n<div class=\"post-layout\">\n<div class=\"votecell post-layout--left\"><\/div>\n<div class=\"answercell post-layout--right\">\n<div class=\"s-prose js-post-body\" itemprop=\"text\">\n<p>As you can tell from some of the comments, multithreaded code is serious business. It&#8217;s best to follow a proven pattern, e.g. producer-consumer, or at least use an established synchronization primitive like a monitor or semaphore. Because I might be wrong. It is easy to go over code that you came up with yourself and miss miss common multithreading concerns, and I&#8217;m not immune to it. I&#8217;ll probably get some downvotes just for commenting without seeing the rest of your solution.<\/p>\n<p>That being said, almost all of the code that you have provided is not multithreaded code. Please correct me if I&#8217;m wrong, but it all runs on the main thread* (well <code>await Task.Wait<\/code> could put your code on a different thread for its continuation, depending on your synchronization context, but it&#8217;ll be given the same threading context). The only parallel processing that occurs comes from the Task that you create to download the file (you didn&#8217;t even include that bit of the code) and the only data element that is subject to parallel access is <code>int concurrentDownloads<\/code>. Because of this, you can get away with using the <code>Queue<\/code> (and not a <code>ConcurrentQueue<\/code>); also, I&#8217;m not sure what the purpose of <code>calcBusy<\/code> is because it seems like it is not needed.<\/p>\n<p>The one thing you have to worry about is that concurrent access to <code>int concurrentDownloads<\/code>, and I do think I see a couple of problems, although they won&#8217;t necessarily manifest themselves on your O\/S and chipset and with your build, although if they did it might be so intermittent that you may not realize until your code has gone to production. Here are the changes I would make:<\/p>\n<ol>\n<li>\n<p>Mark <code>concurrentDownloads<\/code> as <a rel=\"nofollow noopener\" target=\"_blank\" href=\"http:\/\/igoro.com\/archive\/volatile-keyword-in-c-memory-model-explained\/\">Volatile<\/a>. If you don&#8217;t, the compiler might optimize out the variable check entirely, since it may not realize that it is going to be modified on other threads. Also, the CPU might optimize out main memory access, resulting in your threads having different copies of the variable. On Intel you are safe (for now) but if you were to run your code on certain other processors, it may not work. If you use <code>Volatile<\/code>, the CPU will be given special instructions (memory barriers) to ensure caches are flushed appropriately.<\/p>\n<\/li>\n<li>\n<p>Use <a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/msdn.microsoft.com\/en-us\/library\/system.threading.interlocked(v=vs.110).aspx\"><code>Interlocked.Increment(ref int)<\/code> and <code>Interlocked.Decrement(ref int)<\/code><\/a> to modify the counter. If you don&#8217;t, two threads might attempt to modify the value at the same time, and if the chipset doesn&#8217;t support atomic increments, one of the modifications could get lost. <\/p>\n<\/li>\n<\/ol>\n<p>Also, make sure you are actually awaiting your Tasks and handling any exceptions. If a task ends up with an unhandled exception, I believe it&#8217;ll get thrown when the task is garbage collected, and unless you have something to catch it, it&#8217;ll crash your whole process.<\/p>\n<\/p><\/div>\n<div class=\"mt24\"><\/div>\n<\/div>\n<p>            <span class=\"d-none\" itemprop=\"commentCount\">1<\/span> <\/p><\/div>\n<\/div>\n<p>[ad_2]<\/p>\n<p>solved For a concurrent download handler does this create a race condition? <\/p>\n","protected":false},"excerpt":{"rendered":"<p>[ad_1] As you can tell from some of the comments, multithreaded code is serious business. It&#8217;s best to follow a proven pattern, e.g. producer-consumer, or at least use an established synchronization primitive like a monitor or semaphore. Because I might be wrong. It is easy to go over code that you came up with yourself &#8230; <a title=\"[Solved] For a concurrent download handler does this create a race condition?\" class=\"read-more\" href=\"https:\/\/jassweb.com\/solved\/solved-for-a-concurrent-download-handler-does-this-create-a-race-condition\/\" aria-label=\"More on [Solved] For a concurrent download handler does this create a race condition?\">Read more<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[320],"tags":[335,324,929,2440,3836],"class_list":["post-27468","post","type-post","status-publish","format-standard","hentry","category-solved","tag-asynchronous","tag-c","tag-concurrency","tag-queue","tag-race-condition"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>[Solved] For a concurrent download handler does this create a race condition? - JassWeb<\/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:\/\/jassweb.com\/solved\/solved-for-a-concurrent-download-handler-does-this-create-a-race-condition\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"[Solved] For a concurrent download handler does this create a race condition? - JassWeb\" \/>\n<meta property=\"og:description\" content=\"[ad_1] As you can tell from some of the comments, multithreaded code is serious business. It&#8217;s best to follow a proven pattern, e.g. producer-consumer, or at least use an established synchronization primitive like a monitor or semaphore. Because I might be wrong. It is easy to go over code that you came up with yourself ... Read more\" \/>\n<meta property=\"og:url\" content=\"https:\/\/jassweb.com\/solved\/solved-for-a-concurrent-download-handler-does-this-create-a-race-condition\/\" \/>\n<meta property=\"og:site_name\" content=\"JassWeb\" \/>\n<meta property=\"article:published_time\" content=\"2022-12-24T09:33:29+00:00\" \/>\n<meta name=\"author\" content=\"Kirat\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Kirat\" \/>\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:\/\/jassweb.com\/solved\/solved-for-a-concurrent-download-handler-does-this-create-a-race-condition\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/jassweb.com\/solved\/solved-for-a-concurrent-download-handler-does-this-create-a-race-condition\/\"},\"author\":{\"name\":\"Kirat\",\"@id\":\"https:\/\/jassweb.com\/solved\/#\/schema\/person\/65c9c7b7958150c0dc8371fa35dd7c31\"},\"headline\":\"[Solved] For a concurrent download handler does this create a race condition?\",\"datePublished\":\"2022-12-24T09:33:29+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/jassweb.com\/solved\/solved-for-a-concurrent-download-handler-does-this-create-a-race-condition\/\"},\"wordCount\":483,\"publisher\":{\"@id\":\"https:\/\/jassweb.com\/solved\/#organization\"},\"keywords\":[\"asynchronous\",\"c++\",\"concurrency\",\"queue\",\"race-condition\"],\"articleSection\":[\"Solved\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/jassweb.com\/solved\/solved-for-a-concurrent-download-handler-does-this-create-a-race-condition\/\",\"url\":\"https:\/\/jassweb.com\/solved\/solved-for-a-concurrent-download-handler-does-this-create-a-race-condition\/\",\"name\":\"[Solved] For a concurrent download handler does this create a race condition? - JassWeb\",\"isPartOf\":{\"@id\":\"https:\/\/jassweb.com\/solved\/#website\"},\"datePublished\":\"2022-12-24T09:33:29+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/jassweb.com\/solved\/solved-for-a-concurrent-download-handler-does-this-create-a-race-condition\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/jassweb.com\/solved\/solved-for-a-concurrent-download-handler-does-this-create-a-race-condition\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/jassweb.com\/solved\/solved-for-a-concurrent-download-handler-does-this-create-a-race-condition\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/jassweb.com\/solved\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"[Solved] For a concurrent download handler does this create a race condition?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/jassweb.com\/solved\/#website\",\"url\":\"https:\/\/jassweb.com\/solved\/\",\"name\":\"JassWeb\",\"description\":\"Build High-quality Websites\",\"publisher\":{\"@id\":\"https:\/\/jassweb.com\/solved\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/jassweb.com\/solved\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/jassweb.com\/solved\/#organization\",\"name\":\"Jass Web\",\"url\":\"https:\/\/jassweb.com\/solved\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/jassweb.com\/solved\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/jassweb.com\/wp-content\/uploads\/2021\/02\/jass-website-logo-1.png\",\"contentUrl\":\"https:\/\/jassweb.com\/wp-content\/uploads\/2021\/02\/jass-website-logo-1.png\",\"width\":693,\"height\":132,\"caption\":\"Jass Web\"},\"image\":{\"@id\":\"https:\/\/jassweb.com\/solved\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/jassweb.com\/solved\/#\/schema\/person\/65c9c7b7958150c0dc8371fa35dd7c31\",\"name\":\"Kirat\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/jassweb.com\/solved\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/jassweb.com\/solved\/wp-content\/litespeed\/avatar\/1261af3c9451399fa1336d28b98ea3bb.jpg?ver=1775798750\",\"contentUrl\":\"https:\/\/jassweb.com\/solved\/wp-content\/litespeed\/avatar\/1261af3c9451399fa1336d28b98ea3bb.jpg?ver=1775798750\",\"caption\":\"Kirat\"},\"sameAs\":[\"http:\/\/jassweb.com\"],\"url\":\"https:\/\/jassweb.com\/solved\/author\/jaspritsinghghumangmail-com\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"[Solved] For a concurrent download handler does this create a race condition? - JassWeb","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:\/\/jassweb.com\/solved\/solved-for-a-concurrent-download-handler-does-this-create-a-race-condition\/","og_locale":"en_US","og_type":"article","og_title":"[Solved] For a concurrent download handler does this create a race condition? - JassWeb","og_description":"[ad_1] As you can tell from some of the comments, multithreaded code is serious business. It&#8217;s best to follow a proven pattern, e.g. producer-consumer, or at least use an established synchronization primitive like a monitor or semaphore. Because I might be wrong. It is easy to go over code that you came up with yourself ... Read more","og_url":"https:\/\/jassweb.com\/solved\/solved-for-a-concurrent-download-handler-does-this-create-a-race-condition\/","og_site_name":"JassWeb","article_published_time":"2022-12-24T09:33:29+00:00","author":"Kirat","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Kirat","Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/jassweb.com\/solved\/solved-for-a-concurrent-download-handler-does-this-create-a-race-condition\/#article","isPartOf":{"@id":"https:\/\/jassweb.com\/solved\/solved-for-a-concurrent-download-handler-does-this-create-a-race-condition\/"},"author":{"name":"Kirat","@id":"https:\/\/jassweb.com\/solved\/#\/schema\/person\/65c9c7b7958150c0dc8371fa35dd7c31"},"headline":"[Solved] For a concurrent download handler does this create a race condition?","datePublished":"2022-12-24T09:33:29+00:00","mainEntityOfPage":{"@id":"https:\/\/jassweb.com\/solved\/solved-for-a-concurrent-download-handler-does-this-create-a-race-condition\/"},"wordCount":483,"publisher":{"@id":"https:\/\/jassweb.com\/solved\/#organization"},"keywords":["asynchronous","c++","concurrency","queue","race-condition"],"articleSection":["Solved"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/jassweb.com\/solved\/solved-for-a-concurrent-download-handler-does-this-create-a-race-condition\/","url":"https:\/\/jassweb.com\/solved\/solved-for-a-concurrent-download-handler-does-this-create-a-race-condition\/","name":"[Solved] For a concurrent download handler does this create a race condition? - JassWeb","isPartOf":{"@id":"https:\/\/jassweb.com\/solved\/#website"},"datePublished":"2022-12-24T09:33:29+00:00","breadcrumb":{"@id":"https:\/\/jassweb.com\/solved\/solved-for-a-concurrent-download-handler-does-this-create-a-race-condition\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/jassweb.com\/solved\/solved-for-a-concurrent-download-handler-does-this-create-a-race-condition\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/jassweb.com\/solved\/solved-for-a-concurrent-download-handler-does-this-create-a-race-condition\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/jassweb.com\/solved\/"},{"@type":"ListItem","position":2,"name":"[Solved] For a concurrent download handler does this create a race condition?"}]},{"@type":"WebSite","@id":"https:\/\/jassweb.com\/solved\/#website","url":"https:\/\/jassweb.com\/solved\/","name":"JassWeb","description":"Build High-quality Websites","publisher":{"@id":"https:\/\/jassweb.com\/solved\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/jassweb.com\/solved\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/jassweb.com\/solved\/#organization","name":"Jass Web","url":"https:\/\/jassweb.com\/solved\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/jassweb.com\/solved\/#\/schema\/logo\/image\/","url":"https:\/\/jassweb.com\/wp-content\/uploads\/2021\/02\/jass-website-logo-1.png","contentUrl":"https:\/\/jassweb.com\/wp-content\/uploads\/2021\/02\/jass-website-logo-1.png","width":693,"height":132,"caption":"Jass Web"},"image":{"@id":"https:\/\/jassweb.com\/solved\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/jassweb.com\/solved\/#\/schema\/person\/65c9c7b7958150c0dc8371fa35dd7c31","name":"Kirat","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/jassweb.com\/solved\/#\/schema\/person\/image\/","url":"https:\/\/jassweb.com\/solved\/wp-content\/litespeed\/avatar\/1261af3c9451399fa1336d28b98ea3bb.jpg?ver=1775798750","contentUrl":"https:\/\/jassweb.com\/solved\/wp-content\/litespeed\/avatar\/1261af3c9451399fa1336d28b98ea3bb.jpg?ver=1775798750","caption":"Kirat"},"sameAs":["http:\/\/jassweb.com"],"url":"https:\/\/jassweb.com\/solved\/author\/jaspritsinghghumangmail-com\/"}]}},"_links":{"self":[{"href":"https:\/\/jassweb.com\/solved\/wp-json\/wp\/v2\/posts\/27468","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jassweb.com\/solved\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jassweb.com\/solved\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jassweb.com\/solved\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/jassweb.com\/solved\/wp-json\/wp\/v2\/comments?post=27468"}],"version-history":[{"count":0,"href":"https:\/\/jassweb.com\/solved\/wp-json\/wp\/v2\/posts\/27468\/revisions"}],"wp:attachment":[{"href":"https:\/\/jassweb.com\/solved\/wp-json\/wp\/v2\/media?parent=27468"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jassweb.com\/solved\/wp-json\/wp\/v2\/categories?post=27468"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jassweb.com\/solved\/wp-json\/wp\/v2\/tags?post=27468"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}