CINXE.COM
Barrier (computer science) - Wikipedia
<!DOCTYPE html> <html class="client-nojs vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-sticky-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-1 vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-1 vector-feature-night-mode-enabled skin-theme-clientpref-day vector-toc-available" lang="en" dir="ltr"> <head> <meta charset="UTF-8"> <title>Barrier (computer science) - Wikipedia</title> <script>(function(){var className="client-js vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-sticky-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-1 vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-1 vector-feature-night-mode-enabled skin-theme-clientpref-day vector-toc-available";var cookie=document.cookie.match(/(?:^|; )enwikimwclientpreferences=([^;]+)/);if(cookie){cookie[1].split('%2C').forEach(function(pref){className=className.replace(new RegExp('(^| )'+pref.replace(/-clientpref-\w+$|[^\w-]+/g,'')+'-clientpref-\\w+( |$)'),'$1'+pref+'$2');});}document.documentElement.className=className;}());RLCONF={"wgBreakFrames":false,"wgSeparatorTransformTable":["",""],"wgDigitTransformTable":["",""],"wgDefaultDateFormat":"dmy", "wgMonthNames":["","January","February","March","April","May","June","July","August","September","October","November","December"],"wgRequestId":"c2b2c19b-210e-434f-b1e6-7b02aba87fa2","wgCanonicalNamespace":"","wgCanonicalSpecialPageName":false,"wgNamespaceNumber":0,"wgPageName":"Barrier_(computer_science)","wgTitle":"Barrier (computer science)","wgCurRevisionId":1247285491,"wgRevisionId":1247285491,"wgArticleId":4736263,"wgIsArticle":true,"wgIsRedirect":false,"wgAction":"view","wgUserName":null,"wgUserGroups":["*"],"wgCategories":["Articles with short description","Short description is different from Wikidata","All articles with unsourced statements","Articles with unsourced statements from May 2024","Synchronization","Concurrency control","Concurrency (computer science)","Parallel computing"],"wgPageViewLanguage":"en","wgPageContentLanguage":"en","wgPageContentModel":"wikitext","wgRelevantPageName":"Barrier_(computer_science)","wgRelevantArticleId":4736263,"wgIsProbablyEditable":true, "wgRelevantPageIsProbablyEditable":true,"wgRestrictionEdit":[],"wgRestrictionMove":[],"wgNoticeProject":"wikipedia","wgCiteReferencePreviewsActive":false,"wgFlaggedRevsParams":{"tags":{"status":{"levels":1}}},"wgMediaViewerOnClick":true,"wgMediaViewerEnabledByDefault":true,"wgPopupsFlags":0,"wgVisualEditor":{"pageLanguageCode":"en","pageLanguageDir":"ltr","pageVariantFallbacks":"en"},"wgMFDisplayWikibaseDescriptions":{"search":true,"watchlist":true,"tagline":false,"nearby":true},"wgWMESchemaEditAttemptStepOversample":false,"wgWMEPageLength":20000,"wgRelatedArticlesCompat":[],"wgCentralAuthMobileDomain":false,"wgEditSubmitButtonLabelPublish":true,"wgULSPosition":"interlanguage","wgULSisCompactLinksEnabled":false,"wgVector2022LanguageInHeader":true,"wgULSisLanguageSelectorEmpty":false,"wgWikibaseItemId":"Q2885682","wgCheckUserClientHintsHeadersJsApi":["brands","architecture","bitness","fullVersionList","mobile","model","platform","platformVersion"],"GEHomepageSuggestedEditsEnableTopics": true,"wgGETopicsMatchModeEnabled":false,"wgGEStructuredTaskRejectionReasonTextInputEnabled":false,"wgGELevelingUpEnabledForUser":false};RLSTATE={"ext.globalCssJs.user.styles":"ready","site.styles":"ready","user.styles":"ready","ext.globalCssJs.user":"ready","user":"ready","user.options":"loading","ext.cite.styles":"ready","ext.pygments":"ready","skins.vector.search.codex.styles":"ready","skins.vector.styles":"ready","skins.vector.icons":"ready","jquery.makeCollapsible.styles":"ready","ext.wikimediamessages.styles":"ready","ext.visualEditor.desktopArticleTarget.noscript":"ready","ext.uls.interlanguage":"ready","wikibase.client.init":"ready","ext.wikimediaBadges":"ready"};RLPAGEMODULES=["ext.cite.ux-enhancements","ext.pygments.view","site","mediawiki.page.ready","jquery.makeCollapsible","mediawiki.toc","skins.vector.js","ext.centralNotice.geoIP","ext.centralNotice.startUp","ext.gadget.ReferenceTooltips","ext.gadget.switcher","ext.urlShortener.toolbar","ext.centralauth.centralautologin", "mmv.bootstrap","ext.popups","ext.visualEditor.desktopArticleTarget.init","ext.visualEditor.targetLoader","ext.echo.centralauth","ext.eventLogging","ext.wikimediaEvents","ext.navigationTiming","ext.uls.interface","ext.cx.eventlogging.campaigns","ext.cx.uls.quick.actions","wikibase.client.vector-2022","ext.checkUser.clientHints","ext.growthExperiments.SuggestedEditSession","wikibase.sidebar.tracking"];</script> <script>(RLQ=window.RLQ||[]).push(function(){mw.loader.impl(function(){return["user.options@12s5i",function($,jQuery,require,module){mw.user.tokens.set({"patrolToken":"+\\","watchToken":"+\\","csrfToken":"+\\"}); }];});});</script> <link rel="stylesheet" href="/w/load.php?lang=en&modules=ext.cite.styles%7Cext.pygments%2CwikimediaBadges%7Cext.uls.interlanguage%7Cext.visualEditor.desktopArticleTarget.noscript%7Cext.wikimediamessages.styles%7Cjquery.makeCollapsible.styles%7Cskins.vector.icons%2Cstyles%7Cskins.vector.search.codex.styles%7Cwikibase.client.init&only=styles&skin=vector-2022"> <script async="" src="/w/load.php?lang=en&modules=startup&only=scripts&raw=1&skin=vector-2022"></script> <meta name="ResourceLoaderDynamicStyles" content=""> <link rel="stylesheet" href="/w/load.php?lang=en&modules=site.styles&only=styles&skin=vector-2022"> <meta name="generator" content="MediaWiki 1.44.0-wmf.4"> <meta name="referrer" content="origin"> <meta name="referrer" content="origin-when-cross-origin"> <meta name="robots" content="max-image-preview:standard"> <meta name="format-detection" content="telephone=no"> <meta name="viewport" content="width=1120"> <meta property="og:title" content="Barrier (computer science) - Wikipedia"> <meta property="og:type" content="website"> <link rel="preconnect" href="//upload.wikimedia.org"> <link rel="alternate" media="only screen and (max-width: 640px)" href="//en.m.wikipedia.org/wiki/Barrier_(computer_science)"> <link rel="alternate" type="application/x-wiki" title="Edit this page" href="/w/index.php?title=Barrier_(computer_science)&action=edit"> <link rel="apple-touch-icon" href="/static/apple-touch/wikipedia.png"> <link rel="icon" href="/static/favicon/wikipedia.ico"> <link rel="search" type="application/opensearchdescription+xml" href="/w/rest.php/v1/search" title="Wikipedia (en)"> <link rel="EditURI" type="application/rsd+xml" href="//en.wikipedia.org/w/api.php?action=rsd"> <link rel="canonical" href="https://en.wikipedia.org/wiki/Barrier_(computer_science)"> <link rel="license" href="https://creativecommons.org/licenses/by-sa/4.0/deed.en"> <link rel="alternate" type="application/atom+xml" title="Wikipedia Atom feed" href="/w/index.php?title=Special:RecentChanges&feed=atom"> <link rel="dns-prefetch" href="//meta.wikimedia.org" /> <link rel="dns-prefetch" href="//login.wikimedia.org"> </head> <body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject mw-editable page-Barrier_computer_science rootpage-Barrier_computer_science skin-vector-2022 action-view"><a class="mw-jump-link" href="#bodyContent">Jump to content</a> <div class="vector-header-container"> <header class="vector-header mw-header"> <div class="vector-header-start"> <nav class="vector-main-menu-landmark" aria-label="Site"> <div id="vector-main-menu-dropdown" class="vector-dropdown vector-main-menu-dropdown vector-button-flush-left vector-button-flush-right" > <input type="checkbox" id="vector-main-menu-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-main-menu-dropdown" class="vector-dropdown-checkbox " aria-label="Main menu" > <label id="vector-main-menu-dropdown-label" for="vector-main-menu-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only " aria-hidden="true" ><span class="vector-icon mw-ui-icon-menu mw-ui-icon-wikimedia-menu"></span> <span class="vector-dropdown-label-text">Main menu</span> </label> <div class="vector-dropdown-content"> <div id="vector-main-menu-unpinned-container" class="vector-unpinned-container"> <div id="vector-main-menu" class="vector-main-menu vector-pinnable-element"> <div class="vector-pinnable-header vector-main-menu-pinnable-header vector-pinnable-header-unpinned" data-feature-name="main-menu-pinned" data-pinnable-element-id="vector-main-menu" data-pinned-container-id="vector-main-menu-pinned-container" data-unpinned-container-id="vector-main-menu-unpinned-container" > <div class="vector-pinnable-header-label">Main menu</div> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-pin-button" data-event-name="pinnable-header.vector-main-menu.pin">move to sidebar</button> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-unpin-button" data-event-name="pinnable-header.vector-main-menu.unpin">hide</button> </div> <div id="p-navigation" class="vector-menu mw-portlet mw-portlet-navigation" > <div class="vector-menu-heading"> Navigation </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="n-mainpage-description" class="mw-list-item"><a href="/wiki/Main_Page" title="Visit the main page [z]" accesskey="z"><span>Main page</span></a></li><li id="n-contents" class="mw-list-item"><a href="/wiki/Wikipedia:Contents" title="Guides to browsing Wikipedia"><span>Contents</span></a></li><li id="n-currentevents" class="mw-list-item"><a href="/wiki/Portal:Current_events" title="Articles related to current events"><span>Current events</span></a></li><li id="n-randompage" class="mw-list-item"><a href="/wiki/Special:Random" title="Visit a randomly selected article [x]" accesskey="x"><span>Random article</span></a></li><li id="n-aboutsite" class="mw-list-item"><a href="/wiki/Wikipedia:About" title="Learn about Wikipedia and how it works"><span>About Wikipedia</span></a></li><li id="n-contactpage" class="mw-list-item"><a href="//en.wikipedia.org/wiki/Wikipedia:Contact_us" title="How to contact Wikipedia"><span>Contact us</span></a></li> </ul> </div> </div> <div id="p-interaction" class="vector-menu mw-portlet mw-portlet-interaction" > <div class="vector-menu-heading"> Contribute </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="n-help" class="mw-list-item"><a href="/wiki/Help:Contents" title="Guidance on how to use and edit Wikipedia"><span>Help</span></a></li><li id="n-introduction" class="mw-list-item"><a href="/wiki/Help:Introduction" title="Learn how to edit Wikipedia"><span>Learn to edit</span></a></li><li id="n-portal" class="mw-list-item"><a href="/wiki/Wikipedia:Community_portal" title="The hub for editors"><span>Community portal</span></a></li><li id="n-recentchanges" class="mw-list-item"><a href="/wiki/Special:RecentChanges" title="A list of recent changes to Wikipedia [r]" accesskey="r"><span>Recent changes</span></a></li><li id="n-upload" class="mw-list-item"><a href="/wiki/Wikipedia:File_upload_wizard" title="Add images or other media for use on Wikipedia"><span>Upload file</span></a></li> </ul> </div> </div> </div> </div> </div> </div> </nav> <a href="/wiki/Main_Page" class="mw-logo"> <img class="mw-logo-icon" src="/static/images/icons/wikipedia.png" alt="" aria-hidden="true" height="50" width="50"> <span class="mw-logo-container skin-invert"> <img class="mw-logo-wordmark" alt="Wikipedia" src="/static/images/mobile/copyright/wikipedia-wordmark-en.svg" style="width: 7.5em; height: 1.125em;"> <img class="mw-logo-tagline" alt="The Free Encyclopedia" src="/static/images/mobile/copyright/wikipedia-tagline-en.svg" width="117" height="13" style="width: 7.3125em; height: 0.8125em;"> </span> </a> </div> <div class="vector-header-end"> <div id="p-search" role="search" class="vector-search-box-vue vector-search-box-collapses vector-search-box-show-thumbnail vector-search-box-auto-expand-width vector-search-box"> <a href="/wiki/Special:Search" class="cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only search-toggle" title="Search Wikipedia [f]" accesskey="f"><span class="vector-icon mw-ui-icon-search mw-ui-icon-wikimedia-search"></span> <span>Search</span> </a> <div class="vector-typeahead-search-container"> <div class="cdx-typeahead-search cdx-typeahead-search--show-thumbnail cdx-typeahead-search--auto-expand-width"> <form action="/w/index.php" id="searchform" class="cdx-search-input cdx-search-input--has-end-button"> <div id="simpleSearch" class="cdx-search-input__input-wrapper" data-search-loc="header-moved"> <div class="cdx-text-input cdx-text-input--has-start-icon"> <input class="cdx-text-input__input" type="search" name="search" placeholder="Search Wikipedia" aria-label="Search Wikipedia" autocapitalize="sentences" title="Search Wikipedia [f]" accesskey="f" id="searchInput" > <span class="cdx-text-input__icon cdx-text-input__start-icon"></span> </div> <input type="hidden" name="title" value="Special:Search"> </div> <button class="cdx-button cdx-search-input__end-button">Search</button> </form> </div> </div> </div> <nav class="vector-user-links vector-user-links-wide" aria-label="Personal tools"> <div class="vector-user-links-main"> <div id="p-vector-user-menu-preferences" class="vector-menu mw-portlet emptyPortlet" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> </div> </div> <div id="p-vector-user-menu-userpage" class="vector-menu mw-portlet emptyPortlet" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> </div> </div> <nav class="vector-appearance-landmark" aria-label="Appearance"> <div id="vector-appearance-dropdown" class="vector-dropdown " title="Change the appearance of the page's font size, width, and color" > <input type="checkbox" id="vector-appearance-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-appearance-dropdown" class="vector-dropdown-checkbox " aria-label="Appearance" > <label id="vector-appearance-dropdown-label" for="vector-appearance-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only " aria-hidden="true" ><span class="vector-icon mw-ui-icon-appearance mw-ui-icon-wikimedia-appearance"></span> <span class="vector-dropdown-label-text">Appearance</span> </label> <div class="vector-dropdown-content"> <div id="vector-appearance-unpinned-container" class="vector-unpinned-container"> </div> </div> </div> </nav> <div id="p-vector-user-menu-notifications" class="vector-menu mw-portlet emptyPortlet" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> </div> </div> <div id="p-vector-user-menu-overflow" class="vector-menu mw-portlet" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="pt-sitesupport-2" class="user-links-collapsible-item mw-list-item user-links-collapsible-item"><a data-mw="interface" href="https://donate.wikimedia.org/wiki/Special:FundraiserRedirector?utm_source=donate&utm_medium=sidebar&utm_campaign=C13_en.wikipedia.org&uselang=en" class=""><span>Donate</span></a> </li> <li id="pt-createaccount-2" class="user-links-collapsible-item mw-list-item user-links-collapsible-item"><a data-mw="interface" href="/w/index.php?title=Special:CreateAccount&returnto=Barrier+%28computer+science%29" title="You are encouraged to create an account and log in; however, it is not mandatory" class=""><span>Create account</span></a> </li> <li id="pt-login-2" class="user-links-collapsible-item mw-list-item user-links-collapsible-item"><a data-mw="interface" href="/w/index.php?title=Special:UserLogin&returnto=Barrier+%28computer+science%29" title="You're encouraged to log in; however, it's not mandatory. [o]" accesskey="o" class=""><span>Log in</span></a> </li> </ul> </div> </div> </div> <div id="vector-user-links-dropdown" class="vector-dropdown vector-user-menu vector-button-flush-right vector-user-menu-logged-out" title="Log in and more options" > <input type="checkbox" id="vector-user-links-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-user-links-dropdown" class="vector-dropdown-checkbox " aria-label="Personal tools" > <label id="vector-user-links-dropdown-label" for="vector-user-links-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only " aria-hidden="true" ><span class="vector-icon mw-ui-icon-ellipsis mw-ui-icon-wikimedia-ellipsis"></span> <span class="vector-dropdown-label-text">Personal tools</span> </label> <div class="vector-dropdown-content"> <div id="p-personal" class="vector-menu mw-portlet mw-portlet-personal user-links-collapsible-item" title="User menu" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="pt-sitesupport" class="user-links-collapsible-item mw-list-item"><a href="https://donate.wikimedia.org/wiki/Special:FundraiserRedirector?utm_source=donate&utm_medium=sidebar&utm_campaign=C13_en.wikipedia.org&uselang=en"><span>Donate</span></a></li><li id="pt-createaccount" class="user-links-collapsible-item mw-list-item"><a href="/w/index.php?title=Special:CreateAccount&returnto=Barrier+%28computer+science%29" title="You are encouraged to create an account and log in; however, it is not mandatory"><span class="vector-icon mw-ui-icon-userAdd mw-ui-icon-wikimedia-userAdd"></span> <span>Create account</span></a></li><li id="pt-login" class="user-links-collapsible-item mw-list-item"><a href="/w/index.php?title=Special:UserLogin&returnto=Barrier+%28computer+science%29" title="You're encouraged to log in; however, it's not mandatory. [o]" accesskey="o"><span class="vector-icon mw-ui-icon-logIn mw-ui-icon-wikimedia-logIn"></span> <span>Log in</span></a></li> </ul> </div> </div> <div id="p-user-menu-anon-editor" class="vector-menu mw-portlet mw-portlet-user-menu-anon-editor" > <div class="vector-menu-heading"> Pages for logged out editors <a href="/wiki/Help:Introduction" aria-label="Learn more about editing"><span>learn more</span></a> </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="pt-anoncontribs" class="mw-list-item"><a href="/wiki/Special:MyContributions" title="A list of edits made from this IP address [y]" accesskey="y"><span>Contributions</span></a></li><li id="pt-anontalk" class="mw-list-item"><a href="/wiki/Special:MyTalk" title="Discussion about edits from this IP address [n]" accesskey="n"><span>Talk</span></a></li> </ul> </div> </div> </div> </div> </nav> </div> </header> </div> <div class="mw-page-container"> <div class="mw-page-container-inner"> <div class="vector-sitenotice-container"> <div id="siteNotice"><!-- CentralNotice --></div> </div> <div class="vector-column-start"> <div class="vector-main-menu-container"> <div id="mw-navigation"> <nav id="mw-panel" class="vector-main-menu-landmark" aria-label="Site"> <div id="vector-main-menu-pinned-container" class="vector-pinned-container"> </div> </nav> </div> </div> <div class="vector-sticky-pinned-container"> <nav id="mw-panel-toc" aria-label="Contents" data-event-name="ui.sidebar-toc" class="mw-table-of-contents-container vector-toc-landmark"> <div id="vector-toc-pinned-container" class="vector-pinned-container"> <div id="vector-toc" class="vector-toc vector-pinnable-element"> <div class="vector-pinnable-header vector-toc-pinnable-header vector-pinnable-header-pinned" data-feature-name="toc-pinned" data-pinnable-element-id="vector-toc" > <h2 class="vector-pinnable-header-label">Contents</h2> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-pin-button" data-event-name="pinnable-header.vector-toc.pin">move to sidebar</button> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-unpin-button" data-event-name="pinnable-header.vector-toc.unpin">hide</button> </div> <ul class="vector-toc-contents" id="mw-panel-toc-list"> <li id="toc-mw-content-text" class="vector-toc-list-item vector-toc-level-1"> <a href="#" class="vector-toc-link"> <div class="vector-toc-text">(Top)</div> </a> </li> <li id="toc-Implementation" class="vector-toc-list-item vector-toc-level-1 vector-toc-list-item-expanded"> <a class="vector-toc-link" href="#Implementation"> <div class="vector-toc-text"> <span class="vector-toc-numb">1</span> <span>Implementation</span> </div> </a> <button aria-controls="toc-Implementation-sublist" class="cdx-button cdx-button--weight-quiet cdx-button--icon-only vector-toc-toggle"> <span class="vector-icon mw-ui-icon-wikimedia-expand"></span> <span>Toggle Implementation subsection</span> </button> <ul id="toc-Implementation-sublist" class="vector-toc-list"> <li id="toc-Sense-Reversal_Centralized_Barrier" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Sense-Reversal_Centralized_Barrier"> <div class="vector-toc-text"> <span class="vector-toc-numb">1.1</span> <span>Sense-Reversal Centralized Barrier</span> </div> </a> <ul id="toc-Sense-Reversal_Centralized_Barrier-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Combining_Tree_Barrier" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Combining_Tree_Barrier"> <div class="vector-toc-text"> <span class="vector-toc-numb">1.2</span> <span>Combining Tree Barrier</span> </div> </a> <ul id="toc-Combining_Tree_Barrier-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Hardware_Barrier_Implementation" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Hardware_Barrier_Implementation"> <div class="vector-toc-text"> <span class="vector-toc-numb">1.3</span> <span>Hardware Barrier Implementation</span> </div> </a> <ul id="toc-Hardware_Barrier_Implementation-sublist" class="vector-toc-list"> </ul> </li> </ul> </li> <li id="toc-POSIX_Thread_barrier_functions" class="vector-toc-list-item vector-toc-level-1 vector-toc-list-item-expanded"> <a class="vector-toc-link" href="#POSIX_Thread_barrier_functions"> <div class="vector-toc-text"> <span class="vector-toc-numb">2</span> <span>POSIX Thread barrier functions</span> </div> </a> <ul id="toc-POSIX_Thread_barrier_functions-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-See_also" class="vector-toc-list-item vector-toc-level-1 vector-toc-list-item-expanded"> <a class="vector-toc-link" href="#See_also"> <div class="vector-toc-text"> <span class="vector-toc-numb">3</span> <span>See also</span> </div> </a> <ul id="toc-See_also-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-References" class="vector-toc-list-item vector-toc-level-1 vector-toc-list-item-expanded"> <a class="vector-toc-link" href="#References"> <div class="vector-toc-text"> <span class="vector-toc-numb">4</span> <span>References</span> </div> </a> <ul id="toc-References-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-External_links" class="vector-toc-list-item vector-toc-level-1 vector-toc-list-item-expanded"> <a class="vector-toc-link" href="#External_links"> <div class="vector-toc-text"> <span class="vector-toc-numb">5</span> <span>External links</span> </div> </a> <ul id="toc-External_links-sublist" class="vector-toc-list"> </ul> </li> </ul> </div> </div> </nav> </div> </div> <div class="mw-content-container"> <main id="content" class="mw-body"> <header class="mw-body-header vector-page-titlebar"> <nav aria-label="Contents" class="vector-toc-landmark"> <div id="vector-page-titlebar-toc" class="vector-dropdown vector-page-titlebar-toc vector-button-flush-left" > <input type="checkbox" id="vector-page-titlebar-toc-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-page-titlebar-toc" class="vector-dropdown-checkbox " aria-label="Toggle the table of contents" > <label id="vector-page-titlebar-toc-label" for="vector-page-titlebar-toc-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only " aria-hidden="true" ><span class="vector-icon mw-ui-icon-listBullet mw-ui-icon-wikimedia-listBullet"></span> <span class="vector-dropdown-label-text">Toggle the table of contents</span> </label> <div class="vector-dropdown-content"> <div id="vector-page-titlebar-toc-unpinned-container" class="vector-unpinned-container"> </div> </div> </div> </nav> <h1 id="firstHeading" class="firstHeading mw-first-heading"><span class="mw-page-title-main">Barrier (computer science)</span></h1> <div id="p-lang-btn" class="vector-dropdown mw-portlet mw-portlet-lang" > <input type="checkbox" id="p-lang-btn-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-p-lang-btn" class="vector-dropdown-checkbox mw-interlanguage-selector" aria-label="Go to an article in another language. Available in 10 languages" > <label id="p-lang-btn-label" for="p-lang-btn-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--action-progressive mw-portlet-lang-heading-10" aria-hidden="true" ><span class="vector-icon mw-ui-icon-language-progressive mw-ui-icon-wikimedia-language-progressive"></span> <span class="vector-dropdown-label-text">10 languages</span> </label> <div class="vector-dropdown-content"> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li class="interlanguage-link interwiki-ar mw-list-item"><a href="https://ar.wikipedia.org/wiki/%D8%AD%D8%A7%D8%AC%D8%B2_(%D8%AD%D9%88%D8%B3%D8%A8%D8%A9)" title="حاجز (حوسبة) – Arabic" lang="ar" hreflang="ar" data-title="حاجز (حوسبة)" data-language-autonym="العربية" data-language-local-name="Arabic" class="interlanguage-link-target"><span>العربية</span></a></li><li class="interlanguage-link interwiki-be mw-list-item"><a href="https://be.wikipedia.org/wiki/%D0%91%D0%B0%D1%80%E2%80%99%D0%B5%D1%80%D0%BD%D0%B0%D1%8F_%D1%81%D1%96%D0%BD%D1%85%D1%80%D0%B0%D0%BD%D1%96%D0%B7%D0%B0%D1%86%D1%8B%D1%8F" title="Бар’ерная сінхранізацыя – Belarusian" lang="be" hreflang="be" data-title="Бар’ерная сінхранізацыя" data-language-autonym="Беларуская" data-language-local-name="Belarusian" class="interlanguage-link-target"><span>Беларуская</span></a></li><li class="interlanguage-link interwiki-es mw-list-item"><a href="https://es.wikipedia.org/wiki/Barrera_(inform%C3%A1tica)" title="Barrera (informática) – Spanish" lang="es" hreflang="es" data-title="Barrera (informática)" data-language-autonym="Español" data-language-local-name="Spanish" class="interlanguage-link-target"><span>Español</span></a></li><li class="interlanguage-link interwiki-fa mw-list-item"><a href="https://fa.wikipedia.org/wiki/%D9%85%D8%A7%D9%86%D8%B9_%D9%87%D9%85%DA%AF%D8%A7%D9%85%E2%80%8C%D8%B3%D8%A7%D8%B2%DB%8C_(%D8%B9%D9%84%D9%88%D9%85_%D8%B1%D8%A7%DB%8C%D8%A7%D9%86%D9%87)" title="مانع همگامسازی (علوم رایانه) – Persian" lang="fa" hreflang="fa" data-title="مانع همگامسازی (علوم رایانه)" data-language-autonym="فارسی" data-language-local-name="Persian" class="interlanguage-link-target"><span>فارسی</span></a></li><li class="interlanguage-link interwiki-fr mw-list-item"><a href="https://fr.wikipedia.org/wiki/Barri%C3%A8re_de_synchronisation" title="Barrière de synchronisation – French" lang="fr" hreflang="fr" data-title="Barrière de synchronisation" data-language-autonym="Français" data-language-local-name="French" class="interlanguage-link-target"><span>Français</span></a></li><li class="interlanguage-link interwiki-sw mw-list-item"><a href="https://sw.wikipedia.org/wiki/Kizingiti_(tarakilishi)" title="Kizingiti (tarakilishi) – Swahili" lang="sw" hreflang="sw" data-title="Kizingiti (tarakilishi)" data-language-autonym="Kiswahili" data-language-local-name="Swahili" class="interlanguage-link-target"><span>Kiswahili</span></a></li><li class="interlanguage-link interwiki-ja mw-list-item"><a href="https://ja.wikipedia.org/wiki/%E3%83%90%E3%83%AA%E3%82%A2_(%E8%A8%88%E7%AE%97%E6%A9%9F%E7%A7%91%E5%AD%A6)" title="バリア (計算機科学) – Japanese" lang="ja" hreflang="ja" data-title="バリア (計算機科学)" data-language-autonym="日本語" data-language-local-name="Japanese" class="interlanguage-link-target"><span>日本語</span></a></li><li class="interlanguage-link interwiki-ru mw-list-item"><a href="https://ru.wikipedia.org/wiki/%D0%91%D0%B0%D1%80%D1%8C%D0%B5%D1%80%D0%BD%D0%B0%D1%8F_%D1%81%D0%B8%D0%BD%D1%85%D1%80%D0%BE%D0%BD%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F" title="Барьерная синхронизация – Russian" lang="ru" hreflang="ru" data-title="Барьерная синхронизация" data-language-autonym="Русский" data-language-local-name="Russian" class="interlanguage-link-target"><span>Русский</span></a></li><li class="interlanguage-link interwiki-uk mw-list-item"><a href="https://uk.wikipedia.org/wiki/%D0%91%D0%B0%D1%80%27%D1%94%D1%80_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D1%83%D0%B2%D0%B0%D0%BD%D0%BD%D1%8F)" title="Бар'єр (програмування) – Ukrainian" lang="uk" hreflang="uk" data-title="Бар'єр (програмування)" data-language-autonym="Українська" data-language-local-name="Ukrainian" class="interlanguage-link-target"><span>Українська</span></a></li><li class="interlanguage-link interwiki-zh mw-list-item"><a href="https://zh.wikipedia.org/wiki/%E5%90%8C%E6%AD%A5%E5%B1%8F%E9%9A%9C" title="同步屏障 – Chinese" lang="zh" hreflang="zh" data-title="同步屏障" data-language-autonym="中文" data-language-local-name="Chinese" class="interlanguage-link-target"><span>中文</span></a></li> </ul> <div class="after-portlet after-portlet-lang"><span class="wb-langlinks-edit wb-langlinks-link"><a href="https://www.wikidata.org/wiki/Special:EntityPage/Q2885682#sitelinks-wikipedia" title="Edit interlanguage links" class="wbc-editpage">Edit links</a></span></div> </div> </div> </div> </header> <div class="vector-page-toolbar"> <div class="vector-page-toolbar-container"> <div id="left-navigation"> <nav aria-label="Namespaces"> <div id="p-associated-pages" class="vector-menu vector-menu-tabs mw-portlet mw-portlet-associated-pages" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="ca-nstab-main" class="selected vector-tab-noicon mw-list-item"><a href="/wiki/Barrier_(computer_science)" title="View the content page [c]" accesskey="c"><span>Article</span></a></li><li id="ca-talk" class="vector-tab-noicon mw-list-item"><a href="/wiki/Talk:Barrier_(computer_science)" rel="discussion" title="Discuss improvements to the content page [t]" accesskey="t"><span>Talk</span></a></li> </ul> </div> </div> <div id="vector-variants-dropdown" class="vector-dropdown emptyPortlet" > <input type="checkbox" id="vector-variants-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-variants-dropdown" class="vector-dropdown-checkbox " aria-label="Change language variant" > <label id="vector-variants-dropdown-label" for="vector-variants-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet" aria-hidden="true" ><span class="vector-dropdown-label-text">English</span> </label> <div class="vector-dropdown-content"> <div id="p-variants" class="vector-menu mw-portlet mw-portlet-variants emptyPortlet" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> </div> </div> </div> </div> </nav> </div> <div id="right-navigation" class="vector-collapsible"> <nav aria-label="Views"> <div id="p-views" class="vector-menu vector-menu-tabs mw-portlet mw-portlet-views" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="ca-view" class="selected vector-tab-noicon mw-list-item"><a href="/wiki/Barrier_(computer_science)"><span>Read</span></a></li><li id="ca-edit" class="vector-tab-noicon mw-list-item"><a href="/w/index.php?title=Barrier_(computer_science)&action=edit" title="Edit this page [e]" accesskey="e"><span>Edit</span></a></li><li id="ca-history" class="vector-tab-noicon mw-list-item"><a href="/w/index.php?title=Barrier_(computer_science)&action=history" title="Past revisions of this page [h]" accesskey="h"><span>View history</span></a></li> </ul> </div> </div> </nav> <nav class="vector-page-tools-landmark" aria-label="Page tools"> <div id="vector-page-tools-dropdown" class="vector-dropdown vector-page-tools-dropdown" > <input type="checkbox" id="vector-page-tools-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-page-tools-dropdown" class="vector-dropdown-checkbox " aria-label="Tools" > <label id="vector-page-tools-dropdown-label" for="vector-page-tools-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet" aria-hidden="true" ><span class="vector-dropdown-label-text">Tools</span> </label> <div class="vector-dropdown-content"> <div id="vector-page-tools-unpinned-container" class="vector-unpinned-container"> <div id="vector-page-tools" class="vector-page-tools vector-pinnable-element"> <div class="vector-pinnable-header vector-page-tools-pinnable-header vector-pinnable-header-unpinned" data-feature-name="page-tools-pinned" data-pinnable-element-id="vector-page-tools" data-pinned-container-id="vector-page-tools-pinned-container" data-unpinned-container-id="vector-page-tools-unpinned-container" > <div class="vector-pinnable-header-label">Tools</div> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-pin-button" data-event-name="pinnable-header.vector-page-tools.pin">move to sidebar</button> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-unpin-button" data-event-name="pinnable-header.vector-page-tools.unpin">hide</button> </div> <div id="p-cactions" class="vector-menu mw-portlet mw-portlet-cactions emptyPortlet vector-has-collapsible-items" title="More options" > <div class="vector-menu-heading"> Actions </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="ca-more-view" class="selected vector-more-collapsible-item mw-list-item"><a href="/wiki/Barrier_(computer_science)"><span>Read</span></a></li><li id="ca-more-edit" class="vector-more-collapsible-item mw-list-item"><a href="/w/index.php?title=Barrier_(computer_science)&action=edit" title="Edit this page [e]" accesskey="e"><span>Edit</span></a></li><li id="ca-more-history" class="vector-more-collapsible-item mw-list-item"><a href="/w/index.php?title=Barrier_(computer_science)&action=history"><span>View history</span></a></li> </ul> </div> </div> <div id="p-tb" class="vector-menu mw-portlet mw-portlet-tb" > <div class="vector-menu-heading"> General </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="t-whatlinkshere" class="mw-list-item"><a href="/wiki/Special:WhatLinksHere/Barrier_(computer_science)" title="List of all English Wikipedia pages containing links to this page [j]" accesskey="j"><span>What links here</span></a></li><li id="t-recentchangeslinked" class="mw-list-item"><a href="/wiki/Special:RecentChangesLinked/Barrier_(computer_science)" rel="nofollow" title="Recent changes in pages linked from this page [k]" accesskey="k"><span>Related changes</span></a></li><li id="t-upload" class="mw-list-item"><a href="/wiki/Wikipedia:File_Upload_Wizard" title="Upload files [u]" accesskey="u"><span>Upload file</span></a></li><li id="t-specialpages" class="mw-list-item"><a href="/wiki/Special:SpecialPages" title="A list of all special pages [q]" accesskey="q"><span>Special pages</span></a></li><li id="t-permalink" class="mw-list-item"><a href="/w/index.php?title=Barrier_(computer_science)&oldid=1247285491" title="Permanent link to this revision of this page"><span>Permanent link</span></a></li><li id="t-info" class="mw-list-item"><a href="/w/index.php?title=Barrier_(computer_science)&action=info" title="More information about this page"><span>Page information</span></a></li><li id="t-cite" class="mw-list-item"><a href="/w/index.php?title=Special:CiteThisPage&page=Barrier_%28computer_science%29&id=1247285491&wpFormIdentifier=titleform" title="Information on how to cite this page"><span>Cite this page</span></a></li><li id="t-urlshortener" class="mw-list-item"><a href="/w/index.php?title=Special:UrlShortener&url=https%3A%2F%2Fen.wikipedia.org%2Fwiki%2FBarrier_%28computer_science%29"><span>Get shortened URL</span></a></li><li id="t-urlshortener-qrcode" class="mw-list-item"><a href="/w/index.php?title=Special:QrCode&url=https%3A%2F%2Fen.wikipedia.org%2Fwiki%2FBarrier_%28computer_science%29"><span>Download QR code</span></a></li> </ul> </div> </div> <div id="p-coll-print_export" class="vector-menu mw-portlet mw-portlet-coll-print_export" > <div class="vector-menu-heading"> Print/export </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="coll-download-as-rl" class="mw-list-item"><a href="/w/index.php?title=Special:DownloadAsPdf&page=Barrier_%28computer_science%29&action=show-download-screen" title="Download this page as a PDF file"><span>Download as PDF</span></a></li><li id="t-print" class="mw-list-item"><a href="/w/index.php?title=Barrier_(computer_science)&printable=yes" title="Printable version of this page [p]" accesskey="p"><span>Printable version</span></a></li> </ul> </div> </div> <div id="p-wikibase-otherprojects" class="vector-menu mw-portlet mw-portlet-wikibase-otherprojects" > <div class="vector-menu-heading"> In other projects </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="t-wikibase" class="wb-otherproject-link wb-otherproject-wikibase-dataitem mw-list-item"><a href="https://www.wikidata.org/wiki/Special:EntityPage/Q2885682" title="Structured data on this page hosted by Wikidata [g]" accesskey="g"><span>Wikidata item</span></a></li> </ul> </div> </div> </div> </div> </div> </div> </nav> </div> </div> </div> <div class="vector-column-end"> <div class="vector-sticky-pinned-container"> <nav class="vector-page-tools-landmark" aria-label="Page tools"> <div id="vector-page-tools-pinned-container" class="vector-pinned-container"> </div> </nav> <nav class="vector-appearance-landmark" aria-label="Appearance"> <div id="vector-appearance-pinned-container" class="vector-pinned-container"> <div id="vector-appearance" class="vector-appearance vector-pinnable-element"> <div class="vector-pinnable-header vector-appearance-pinnable-header vector-pinnable-header-pinned" data-feature-name="appearance-pinned" data-pinnable-element-id="vector-appearance" data-pinned-container-id="vector-appearance-pinned-container" data-unpinned-container-id="vector-appearance-unpinned-container" > <div class="vector-pinnable-header-label">Appearance</div> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-pin-button" data-event-name="pinnable-header.vector-appearance.pin">move to sidebar</button> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-unpin-button" data-event-name="pinnable-header.vector-appearance.unpin">hide</button> </div> </div> </div> </nav> </div> </div> <div id="bodyContent" class="vector-body" aria-labelledby="firstHeading" data-mw-ve-target-container> <div class="vector-body-before-content"> <div class="mw-indicators"> </div> <div id="siteSub" class="noprint">From Wikipedia, the free encyclopedia</div> </div> <div id="contentSub"><div id="mw-content-subtitle"></div></div> <div id="mw-content-text" class="mw-body-content"><div class="mw-content-ltr mw-parser-output" lang="en" dir="ltr"><div class="shortdescription nomobile noexcerpt noprint searchaux" style="display:none">Synchronization method in parallel computing</div> <p>In <a href="/wiki/Parallel_computing" title="Parallel computing">parallel computing</a>, a <b>barrier</b> is a type of <a href="/wiki/Synchronization_(computer_science)" title="Synchronization (computer science)">synchronization</a> method.<sup id="cite_ref-impl_1-0" class="reference"><a href="#cite_note-impl-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup> A barrier for a group of threads or processes in the source code means any thread/process must stop at this point and cannot proceed until all other threads/processes reach this barrier.<sup id="cite_ref-:3_2-0" class="reference"><a href="#cite_note-:3-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup> </p><p>Many collective routines and directive-based parallel languages impose implicit barriers. For example, a parallel <i>do</i> loop in <a href="/wiki/Fortran" title="Fortran">Fortran</a> with <a href="/wiki/OpenMP" title="OpenMP">OpenMP</a> will not be allowed to continue on any thread until the last iteration is completed.<sup class="noprint Inline-Template Template-Fact" style="white-space:nowrap;">[<i><a href="/wiki/Wikipedia:Citation_needed" title="Wikipedia:Citation needed"><span title="Give the reference for this Fortan example (May 2024)">citation needed</span></a></i>]</sup> This is in case the program relies on the result of the loop immediately after its completion. In <a href="/wiki/Message_passing" title="Message passing">message passing</a>, any global communication (such as reduction or scatter) may imply a barrier. </p><p>In <a href="/wiki/Concurrent_computing" title="Concurrent computing">concurrent computing</a>, a barrier may be in a <i>raised</i> or <i>lowered state</i>. The term <b>latch</b> is sometimes used to refer to a barrier that starts in the raised state and cannot be re-raised once it is in the lowered state. The term <b>count-down latch</b> is sometimes used to refer to a latch that is automatically lowered once a predetermined number of threads/processes have arrived. </p> <meta property="mw:PageProp/toc" /> <div class="mw-heading mw-heading2"><h2 id="Implementation">Implementation</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Barrier_(computer_science)&action=edit&section=1" title="Edit section: Implementation"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>Take an example for thread, known as the <b>thread barrier</b>. The thread barrier needs a variable to <b>keep track of the total number of threads that have entered the barrier</b>.<sup id="cite_ref-:0_3-0" class="reference"><a href="#cite_note-:0-3"><span class="cite-bracket">[</span>3<span class="cite-bracket">]</span></a></sup> Whenever there are enough threads enter the barrier, it will be lifted. A <a href="/wiki/Synchronization_primitive" class="mw-redirect" title="Synchronization primitive">synchronization primitive</a> like <a href="/wiki/Lock_(computer_science)" title="Lock (computer science)">mutex</a> is also needed when implementing the thread barrier. </p><p>This thread barrier method is also known as <b>Centralized Barrier</b> as the threads have to wait in front of a "central barrier" until the expected number of threads have reached the barrier before it is lifted. </p><p>The following C code, which implemented thread barrier by using POSIX Threads will demonstrate this procedure:<sup id="cite_ref-impl_1-1" class="reference"><a href="#cite_note-impl-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup> </p> <div class="mw-highlight mw-highlight-lang-cpp mw-content-ltr mw-highlight-lines" dir="ltr"><pre><span></span><span class="linenos" data-line="1"></span><span class="cp">#include</span><span class="w"> </span><span class="cpf"><stdio.h></span> <span class="linenos" data-line="2"></span><span class="cp">#include</span><span class="w"> </span><span class="cpf"><pthread.h></span> <span class="linenos" data-line="3"></span> <span class="linenos" data-line="4"></span><span class="cp">#define TOTAL_THREADS 2</span> <span class="linenos" data-line="5"></span><span class="cp">#define THREAD_BARRIERS_NUMBER 3</span> <span class="linenos" data-line="6"></span><span class="cp">#define PTHREAD_BARRIER_ATTR NULL </span><span class="c1">// pthread barrier attribute</span> <span class="linenos" data-line="7"></span> <span class="linenos" data-line="8"></span><span class="k">typedef</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">_thread_barrier</span> <span class="linenos" data-line="9"></span><span class="p">{</span> <span class="linenos" data-line="10"></span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">thread_barrier_number</span><span class="p">;</span> <span class="linenos" data-line="11"></span><span class="w"> </span><span class="n">pthread_mutex_t</span><span class="w"> </span><span class="n">lock</span><span class="p">;</span> <span class="linenos" data-line="12"></span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">total_thread</span><span class="p">;</span> <span class="linenos" data-line="13"></span><span class="p">}</span><span class="w"> </span><span class="n">thread_barrier</span><span class="p">;</span> <span class="linenos" data-line="14"></span> <span class="linenos" data-line="15"></span><span class="n">thread_barrier</span><span class="w"> </span><span class="n">barrier</span><span class="p">;</span> <span class="linenos" data-line="16"></span> <span class="linenos" data-line="17"></span><span class="kt">void</span><span class="w"> </span><span class="nf">thread_barrier_init</span><span class="p">(</span><span class="n">thread_barrier</span><span class="w"> </span><span class="o">*</span><span class="n">barrier</span><span class="p">,</span><span class="w"> </span><span class="n">pthread_mutexattr_t</span><span class="w"> </span><span class="o">*</span><span class="n">mutex_attr</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">thread_barrier_number</span><span class="p">){</span> <span class="linenos" data-line="18"></span><span class="w"> </span><span class="n">pthread_mutex_init</span><span class="p">(</span><span class="o">&</span><span class="p">(</span><span class="n">barrier</span><span class="o">-></span><span class="n">lock</span><span class="p">),</span><span class="w"> </span><span class="n">mutex_attr</span><span class="p">);</span> <span class="linenos" data-line="19"></span><span class="w"> </span><span class="n">barrier</span><span class="o">-></span><span class="n">thread_barrier_number</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">thread_barrier_number</span><span class="p">;</span> <span class="linenos" data-line="20"></span><span class="w"> </span><span class="n">barrier</span><span class="o">-></span><span class="n">total_thread</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="c1">// Init total thread to be 0</span> <span class="linenos" data-line="21"></span><span class="p">}</span> <span class="linenos" data-line="22"></span> <span class="linenos" data-line="23"></span><span class="kt">void</span><span class="w"> </span><span class="nf">thread_barrier_wait</span><span class="p">(</span><span class="n">thread_barrier</span><span class="w"> </span><span class="o">*</span><span class="n">barrier</span><span class="p">){</span> <span class="linenos" data-line="24"></span><span class="w"> </span><span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="n">pthread_mutex_lock</span><span class="p">(</span><span class="o">&</span><span class="p">(</span><span class="n">barrier</span><span class="o">-></span><span class="n">lock</span><span class="p">))){</span> <span class="linenos" data-line="25"></span><span class="w"> </span><span class="n">barrier</span><span class="o">-></span><span class="n">total_thread</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span> <span class="linenos" data-line="26"></span><span class="w"> </span><span class="n">pthread_mutex_unlock</span><span class="p">(</span><span class="o">&</span><span class="p">(</span><span class="n">barrier</span><span class="o">-></span><span class="n">lock</span><span class="p">));</span> <span class="linenos" data-line="27"></span><span class="w"> </span><span class="p">}</span> <span class="linenos" data-line="28"></span> <span class="linenos" data-line="29"></span><span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="n">barrier</span><span class="o">-></span><span class="n">total_thread</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="n">barrier</span><span class="o">-></span><span class="n">thread_barrier_number</span><span class="p">);</span> <span class="linenos" data-line="30"></span> <span class="linenos" data-line="31"></span><span class="w"> </span><span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="n">pthread_mutex_lock</span><span class="p">(</span><span class="o">&</span><span class="p">(</span><span class="n">barrier</span><span class="o">-></span><span class="n">lock</span><span class="p">))){</span> <span class="linenos" data-line="32"></span><span class="w"> </span><span class="n">barrier</span><span class="o">-></span><span class="n">total_thread</span><span class="w"> </span><span class="o">-=</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span><span class="w"> </span><span class="c1">// Decrease one thread as it has passed the thread barrier</span> <span class="linenos" data-line="33"></span><span class="w"> </span><span class="n">pthread_mutex_unlock</span><span class="p">(</span><span class="o">&</span><span class="p">(</span><span class="n">barrier</span><span class="o">-></span><span class="n">lock</span><span class="p">));</span> <span class="linenos" data-line="34"></span><span class="w"> </span><span class="p">}</span> <span class="linenos" data-line="35"></span><span class="p">}</span> <span class="linenos" data-line="36"></span> <span class="linenos" data-line="37"></span><span class="kt">void</span><span class="w"> </span><span class="nf">thread_barrier_destroy</span><span class="p">(</span><span class="n">thread_barrier</span><span class="w"> </span><span class="o">*</span><span class="n">barrier</span><span class="p">){</span> <span class="linenos" data-line="38"></span><span class="w"> </span><span class="n">pthread_mutex_destroy</span><span class="p">(</span><span class="o">&</span><span class="p">(</span><span class="n">barrier</span><span class="o">-></span><span class="n">lock</span><span class="p">));</span> <span class="linenos" data-line="39"></span><span class="p">}</span> <span class="linenos" data-line="40"></span> <span class="linenos" data-line="41"></span><span class="kt">void</span><span class="w"> </span><span class="o">*</span><span class="nf">thread_func</span><span class="p">(</span><span class="kt">void</span><span class="w"> </span><span class="o">*</span><span class="n">ptr</span><span class="p">){</span> <span class="linenos" data-line="42"></span><span class="w"> </span><span class="n">printf</span><span class="p">(</span><span class="s">"thread id %ld is waiting at the barrier, as not enough %d threads are running ...</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span><span class="w"> </span><span class="n">pthread_self</span><span class="p">(),</span><span class="w"> </span><span class="n">THREAD_BARRIERS_NUMBER</span><span class="p">);</span> <span class="linenos" data-line="43"></span><span class="w"> </span><span class="n">thread_barrier_wait</span><span class="p">(</span><span class="o">&</span><span class="n">barrier</span><span class="p">);</span> <span class="linenos" data-line="44"></span><span class="w"> </span><span class="n">printf</span><span class="p">(</span><span class="s">"The barrier is lifted, thread id %ld is running now</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span><span class="w"> </span><span class="n">pthread_self</span><span class="p">());</span> <span class="linenos" data-line="45"></span><span class="p">}</span> <span class="linenos" data-line="46"></span> <span class="linenos" data-line="47"></span><span class="kt">int</span><span class="w"> </span><span class="nf">main</span><span class="p">()</span> <span class="linenos" data-line="48"></span><span class="p">{</span><span class="w"> </span> <span class="linenos" data-line="49"></span><span class="w"> </span><span class="n">pthread_t</span><span class="w"> </span><span class="n">thread_id</span><span class="p">[</span><span class="n">TOTAL_THREADS</span><span class="p">];</span> <span class="linenos" data-line="50"></span> <span class="linenos" data-line="51"></span><span class="w"> </span><span class="n">thread_barrier_init</span><span class="p">(</span><span class="o">&</span><span class="n">barrier</span><span class="p">,</span><span class="w"> </span><span class="n">PTHREAD_BARRIER_ATTR</span><span class="p">,</span><span class="w"> </span><span class="n">THREAD_BARRIERS_NUMBER</span><span class="p">);</span> <span class="linenos" data-line="52"></span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="n">TOTAL_THREADS</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">){</span> <span class="linenos" data-line="53"></span><span class="w"> </span><span class="n">pthread_create</span><span class="p">(</span><span class="o">&</span><span class="n">thread_id</span><span class="p">[</span><span class="n">i</span><span class="p">],</span><span class="w"> </span><span class="nb">NULL</span><span class="p">,</span><span class="w"> </span><span class="n">thread_func</span><span class="p">,</span><span class="w"> </span><span class="nb">NULL</span><span class="p">);</span> <span class="linenos" data-line="54"></span><span class="w"> </span><span class="p">}</span> <span class="linenos" data-line="55"></span> <span class="linenos" data-line="56"></span><span class="w"> </span><span class="c1">// As pthread_join() will block the process until all the threads it specified are finished, </span> <span class="linenos" data-line="57"></span><span class="w"> </span><span class="c1">// and there is not enough thread to wait at the barrier, so this process is blocked</span> <span class="linenos" data-line="58"></span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="n">TOTAL_THREADS</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">){</span> <span class="linenos" data-line="59"></span><span class="w"> </span><span class="n">pthread_join</span><span class="p">(</span><span class="n">thread_id</span><span class="p">[</span><span class="n">i</span><span class="p">],</span><span class="w"> </span><span class="nb">NULL</span><span class="p">);</span> <span class="linenos" data-line="60"></span><span class="w"> </span><span class="p">}</span> <span class="linenos" data-line="61"></span> <span class="linenos" data-line="62"></span><span class="w"> </span><span class="n">thread_barrier_destroy</span><span class="p">(</span><span class="o">&</span><span class="n">barrier</span><span class="p">);</span> <span class="linenos" data-line="63"></span><span class="w"> </span><span class="n">printf</span><span class="p">(</span><span class="s">"Thread barrier is lifted</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span><span class="w"> </span><span class="c1">// This line won't be called as TOTAL_THREADS < THREAD_BARRIERS_NUMBER</span> <span class="linenos" data-line="64"></span><span class="p">}</span> </pre></div> <p>In this program, the thread barrier is defined as a struct, <b>struct _thread_barrier,</b> which include: </p> <ul><li><b>total_thread:</b> Total threads in the process</li> <li><b>thread_barrier_number</b>: Total number of threads expected to enter the thread barrier so that it can be lifted</li> <li><b>lock</b>: A POSIX thread mutex lock</li></ul> <p>Based on the definition of barrier, we need to implement a function like <b>thread_barrier_wait()</b> in this program which will "monitor" the total number of thread in the program in order to life the barrier. </p><p>In this program, every thread calls <b>thread_barrier_wait()</b> will be blocked until <b>THREAD_BARRIERS_NUMBER</b> threads reach the thread barrier. </p><p> The result of that program is:</p><div class="mw-highlight mw-highlight-lang-output mw-content-ltr" dir="ltr"><pre><span></span><span class="go">thread id <thread_id, e.g 139997337872128> is waiting at the barrier, as not enough 3 threads are running ...</span> <span class="go">thread id <thread_id, e.g 139997329479424> is waiting at the barrier, as not enough 3 threads are running ...</span> <span class="go">// (main process is blocked as not having enough 3 threads)</span> <span class="go">// Line printf("Thread barrier is lifted\n") won't be reached</span> </pre></div><p>As we can see from the program, there are just only 2 threads are created. Those 2 thread both have <code class="mw-highlight mw-highlight-lang-c mw-content-ltr" style="" dir="ltr"><span class="n">thread_func</span><span class="p">()</span></code>, as the thread function handler, which call <code class="mw-highlight mw-highlight-lang-c mw-content-ltr" style="" dir="ltr"><span class="n">thread_barrier_wait</span><span class="p">(</span><span class="o">&</span><span class="n">barrier</span><span class="p">)</span></code>, while thread barrier expected 3 threads to call <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">thread_barrier_wait</code> (<code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">THREAD_BARRIERS_NUMBER = 3</code>) in order to be lifted. Change TOTAL_THREADS to 3 and the thread barrier is lifted:</p><div class="mw-highlight mw-highlight-lang-output mw-content-ltr" dir="ltr"><pre><span></span><span class="go">thread id <thread ID, e.g 140453108946688> is waiting at the barrier, as not enough 3 threads are running ...</span> <span class="go">thread id <thread ID, e.g 140453117339392> is waiting at the barrier, as not enough 3 threads are running ...</span> <span class="go">thread id <thread ID, e.g 140453100553984> is waiting at the barrier, as not enough 3 threads are running ...</span> <span class="go">The barrier is lifted, thread id <thread ID, e.g 140453108946688> is running now</span> <span class="go">The barrier is lifted, thread id <thread ID, e.g 140453117339392> is running now</span> <span class="go">The barrier is lifted, thread id <thread ID, e.g 140453100553984> is running now</span> <span class="go">Thread barrier is lifted</span> </pre></div> <div class="mw-heading mw-heading3"><h3 id="Sense-Reversal_Centralized_Barrier">Sense-Reversal Centralized Barrier</h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Barrier_(computer_science)&action=edit&section=2" title="Edit section: Sense-Reversal Centralized Barrier"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>Beside decreasing the <b>total thread number</b> by one for every thread successfully passing the thread barrier, thread barrier can use opposite values to mark for every thread state as passing or stopping.<sup id="cite_ref-:2_4-0" class="reference"><a href="#cite_note-:2-4"><span class="cite-bracket">[</span>4<span class="cite-bracket">]</span></a></sup> For example, thread 1 with state value is 0 means it's stopping at the barrier, thread 2 with state value is 1 means it has passed the barrier, thread 3's state value = 0 means it's stopping at the barrier and so on.<sup id="cite_ref-:22_5-0" class="reference"><a href="#cite_note-:22-5"><span class="cite-bracket">[</span>5<span class="cite-bracket">]</span></a></sup> This is known as <b>Sense-Reversal.<sup id="cite_ref-impl_1-2" class="reference"><a href="#cite_note-impl-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup></b> </p><p>The following C code demonstrates this:<sup id="cite_ref-:0_3-1" class="reference"><a href="#cite_note-:0-3"><span class="cite-bracket">[</span>3<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-:1_6-0" class="reference"><a href="#cite_note-:1-6"><span class="cite-bracket">[</span>6<span class="cite-bracket">]</span></a></sup> </p> <div class="mw-highlight mw-highlight-lang-cpp mw-content-ltr mw-highlight-lines" dir="ltr"><pre><span></span><span class="linenos" data-line="1"></span><span class="cp">#include</span><span class="w"> </span><span class="cpf"><stdio.h></span> <span class="linenos" data-line="2"></span><span class="cp">#include</span><span class="w"> </span><span class="cpf"><stdbool.h></span> <span class="linenos" data-line="3"></span><span class="cp">#include</span><span class="w"> </span><span class="cpf"><pthread.h></span> <span class="linenos" data-line="4"></span> <span class="linenos" data-line="5"></span><span class="cp">#define TOTAL_THREADS 2</span> <span class="linenos" data-line="6"></span><span class="cp">#define THREAD_BARRIERS_NUMBER 3</span> <span class="linenos" data-line="7"></span><span class="cp">#define PTHREAD_BARRIER_ATTR NULL </span><span class="c1">// pthread barrier attribute</span> <span class="linenos" data-line="8"></span> <span class="linenos" data-line="9"></span><span class="k">typedef</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">_thread_barrier</span> <span class="linenos" data-line="10"></span><span class="p">{</span> <span class="linenos" data-line="11"></span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">thread_barrier_number</span><span class="p">;</span> <span class="linenos" data-line="12"></span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">total_thread</span><span class="p">;</span> <span class="linenos" data-line="13"></span><span class="w"> </span><span class="n">pthread_mutex_t</span><span class="w"> </span><span class="n">lock</span><span class="p">;</span> <span class="linenos" data-line="14"></span><span class="w"> </span><span class="kt">bool</span><span class="w"> </span><span class="n">flag</span><span class="p">;</span> <span class="linenos" data-line="15"></span><span class="p">}</span><span class="w"> </span><span class="n">thread_barrier</span><span class="p">;</span> <span class="linenos" data-line="16"></span> <span class="linenos" data-line="17"></span><span class="n">thread_barrier</span><span class="w"> </span><span class="n">barrier</span><span class="p">;</span> <span class="linenos" data-line="18"></span> <span class="linenos" data-line="19"></span><span class="kt">void</span><span class="w"> </span><span class="nf">thread_barrier_init</span><span class="p">(</span><span class="n">thread_barrier</span><span class="w"> </span><span class="o">*</span><span class="n">barrier</span><span class="p">,</span><span class="w"> </span><span class="n">pthread_mutexattr_t</span><span class="w"> </span><span class="o">*</span><span class="n">mutex_attr</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">thread_barrier_number</span><span class="p">){</span> <span class="linenos" data-line="20"></span><span class="w"> </span><span class="n">pthread_mutex_init</span><span class="p">(</span><span class="o">&</span><span class="p">(</span><span class="n">barrier</span><span class="o">-></span><span class="n">lock</span><span class="p">),</span><span class="w"> </span><span class="n">mutex_attr</span><span class="p">);</span> <span class="linenos" data-line="21"></span> <span class="linenos" data-line="22"></span><span class="w"> </span><span class="n">barrier</span><span class="o">-></span><span class="n">total_thread</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span> <span class="linenos" data-line="23"></span><span class="w"> </span><span class="n">barrier</span><span class="o">-></span><span class="n">thread_barrier_number</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">thread_barrier_number</span><span class="p">;</span> <span class="linenos" data-line="24"></span><span class="w"> </span><span class="n">barrier</span><span class="o">-></span><span class="n">flag</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">false</span><span class="p">;</span> <span class="linenos" data-line="25"></span><span class="p">}</span> <span class="linenos" data-line="26"></span> <span class="linenos" data-line="27"></span><span class="kt">void</span><span class="w"> </span><span class="nf">thread_barrier_wait</span><span class="p">(</span><span class="n">thread_barrier</span><span class="w"> </span><span class="o">*</span><span class="n">barrier</span><span class="p">){</span> <span class="linenos" data-line="28"></span><span class="w"> </span><span class="kt">bool</span><span class="w"> </span><span class="n">local_sense</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">barrier</span><span class="o">-></span><span class="n">flag</span><span class="p">;</span> <span class="linenos" data-line="29"></span><span class="w"> </span><span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="n">pthread_mutex_lock</span><span class="p">(</span><span class="o">&</span><span class="p">(</span><span class="n">barrier</span><span class="o">-></span><span class="n">lock</span><span class="p">))){</span> <span class="linenos" data-line="30"></span><span class="w"> </span><span class="n">barrier</span><span class="o">-></span><span class="n">total_thread</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span> <span class="linenos" data-line="31"></span><span class="w"> </span><span class="n">local_sense</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">!</span><span class="n">local_sense</span><span class="p">;</span> <span class="linenos" data-line="32"></span><span class="w"> </span> <span class="linenos" data-line="33"></span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">barrier</span><span class="o">-></span><span class="n">total_thread</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">barrier</span><span class="o">-></span><span class="n">thread_barrier_number</span><span class="p">){</span> <span class="linenos" data-line="34"></span><span class="w"> </span><span class="n">barrier</span><span class="o">-></span><span class="n">total_thread</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span> <span class="linenos" data-line="35"></span><span class="w"> </span><span class="n">barrier</span><span class="o">-></span><span class="n">flag</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">local_sense</span><span class="p">;</span> <span class="linenos" data-line="36"></span><span class="w"> </span><span class="n">pthread_mutex_unlock</span><span class="p">(</span><span class="o">&</span><span class="p">(</span><span class="n">barrier</span><span class="o">-></span><span class="n">lock</span><span class="p">));</span> <span class="linenos" data-line="37"></span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span> <span class="linenos" data-line="38"></span><span class="w"> </span><span class="n">pthread_mutex_unlock</span><span class="p">(</span><span class="o">&</span><span class="p">(</span><span class="n">barrier</span><span class="o">-></span><span class="n">lock</span><span class="p">));</span> <span class="linenos" data-line="39"></span><span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="n">barrier</span><span class="o">-></span><span class="n">flag</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">local_sense</span><span class="p">);</span><span class="w"> </span><span class="c1">// wait for flag</span> <span class="linenos" data-line="40"></span><span class="w"> </span><span class="p">}</span> <span class="linenos" data-line="41"></span><span class="w"> </span><span class="p">}</span> <span class="linenos" data-line="42"></span><span class="p">}</span> <span class="linenos" data-line="43"></span> <span class="linenos" data-line="44"></span><span class="kt">void</span><span class="w"> </span><span class="nf">thread_barrier_destroy</span><span class="p">(</span><span class="n">thread_barrier</span><span class="w"> </span><span class="o">*</span><span class="n">barrier</span><span class="p">){</span> <span class="linenos" data-line="45"></span><span class="w"> </span><span class="n">pthread_mutex_destroy</span><span class="p">(</span><span class="o">&</span><span class="p">(</span><span class="n">barrier</span><span class="o">-></span><span class="n">lock</span><span class="p">));</span> <span class="linenos" data-line="46"></span><span class="p">}</span> <span class="linenos" data-line="47"></span> <span class="linenos" data-line="48"></span><span class="kt">void</span><span class="w"> </span><span class="o">*</span><span class="nf">thread_func</span><span class="p">(</span><span class="kt">void</span><span class="w"> </span><span class="o">*</span><span class="n">ptr</span><span class="p">){</span> <span class="linenos" data-line="49"></span><span class="w"> </span><span class="n">printf</span><span class="p">(</span><span class="s">"thread id %ld is waiting at the barrier, as not enough %d threads are running ...</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span><span class="w"> </span><span class="n">pthread_self</span><span class="p">(),</span><span class="w"> </span><span class="n">THREAD_BARRIERS_NUMBER</span><span class="p">);</span> <span class="linenos" data-line="50"></span><span class="w"> </span><span class="n">thread_barrier_wait</span><span class="p">(</span><span class="o">&</span><span class="n">barrier</span><span class="p">);</span> <span class="linenos" data-line="51"></span><span class="w"> </span><span class="n">printf</span><span class="p">(</span><span class="s">"The barrier is lifted, thread id %ld is running now</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span><span class="w"> </span><span class="n">pthread_self</span><span class="p">());</span> <span class="linenos" data-line="52"></span><span class="p">}</span> <span class="linenos" data-line="53"></span> <span class="linenos" data-line="54"></span><span class="kt">int</span><span class="w"> </span><span class="nf">main</span><span class="p">()</span> <span class="linenos" data-line="55"></span><span class="p">{</span><span class="w"> </span> <span class="linenos" data-line="56"></span><span class="w"> </span><span class="n">pthread_t</span><span class="w"> </span><span class="n">thread_id</span><span class="p">[</span><span class="n">TOTAL_THREADS</span><span class="p">];</span> <span class="linenos" data-line="57"></span> <span class="linenos" data-line="58"></span><span class="w"> </span><span class="n">thread_barrier_init</span><span class="p">(</span><span class="o">&</span><span class="n">barrier</span><span class="p">,</span><span class="w"> </span><span class="n">PTHREAD_BARRIER_ATTR</span><span class="p">,</span><span class="w"> </span><span class="n">THREAD_BARRIERS_NUMBER</span><span class="p">);</span> <span class="linenos" data-line="59"></span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="n">TOTAL_THREADS</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">){</span> <span class="linenos" data-line="60"></span><span class="w"> </span><span class="n">pthread_create</span><span class="p">(</span><span class="o">&</span><span class="n">thread_id</span><span class="p">[</span><span class="n">i</span><span class="p">],</span><span class="w"> </span><span class="nb">NULL</span><span class="p">,</span><span class="w"> </span><span class="n">thread_func</span><span class="p">,</span><span class="w"> </span><span class="nb">NULL</span><span class="p">);</span> <span class="linenos" data-line="61"></span><span class="w"> </span><span class="p">}</span> <span class="linenos" data-line="62"></span> <span class="linenos" data-line="63"></span><span class="w"> </span><span class="c1">// As pthread_join() will block the process until all the threads it specified are finished, </span> <span class="linenos" data-line="64"></span><span class="w"> </span><span class="c1">// and there is not enough thread to wait at the barrier, so this process is blocked</span> <span class="linenos" data-line="65"></span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="n">TOTAL_THREADS</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">){</span> <span class="linenos" data-line="66"></span><span class="w"> </span><span class="n">pthread_join</span><span class="p">(</span><span class="n">thread_id</span><span class="p">[</span><span class="n">i</span><span class="p">],</span><span class="w"> </span><span class="nb">NULL</span><span class="p">);</span> <span class="linenos" data-line="67"></span><span class="w"> </span><span class="p">}</span> <span class="linenos" data-line="68"></span> <span class="linenos" data-line="69"></span><span class="w"> </span><span class="n">thread_barrier_destroy</span><span class="p">(</span><span class="o">&</span><span class="n">barrier</span><span class="p">);</span> <span class="linenos" data-line="70"></span><span class="w"> </span><span class="n">printf</span><span class="p">(</span><span class="s">"Thread barrier is lifted</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span><span class="w"> </span><span class="c1">// This line won't be called as TOTAL_THREADS < THREAD_BARRIERS_NUMBER</span> <span class="linenos" data-line="71"></span><span class="p">}</span> </pre></div><p>This program has all features similar to the previous <b>Centralized Barrier</b> source code. It just only implements in a different way by using 2 new variables:<b><sup id="cite_ref-impl_1-3" class="reference"><a href="#cite_note-impl-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup></b> </p><ul><li><b>local_sense</b>: A thread local Boolean variable to check whether THREAD_BARRIERS_NUMBER have arrived at the barrier.</li> <li><b>flag</b>: A Boolean member of <b>struct _thread_barrier</b> to indicate whether THREAD_BARRIERS_NUMBER have arrived at the barrier</li></ul> <p>When a thread stops at the barrier, <b>local_sense</b>'s value is toggled.<b><sup id="cite_ref-impl_1-4" class="reference"><a href="#cite_note-impl-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup></b> When there are less than <b>THREAD_BARRIERS_NUMBER</b> threads stopping at the thread barrier, those threads will keep waiting with the condition that the <b>flag</b> member of <b>struct _thread_barrier</b> is not equal to the private <code><b>local_sense</b></code> variable. </p><p>When there are exactly <b>THREAD_BARRIERS_NUMBER</b> threads stopping at the thread barrier, the <b>total thread number</b> is reset to 0, and the <b>flag</b> is set to <code><b>local_sense</b></code>. </p> <div class="mw-heading mw-heading3"><h3 id="Combining_Tree_Barrier">Combining Tree Barrier</h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Barrier_(computer_science)&action=edit&section=3" title="Edit section: Combining Tree Barrier"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>The potential problem with the <b>Centralized Barrier</b> is that due to all the threads repeatedly accessing the global variable for pass/stop, the communication traffic is rather high, which decreases the <a href="/wiki/Scalability_testing" title="Scalability testing">scalability</a>. </p><p>This problem can be resolved by regrouping the threads and using multi-level barrier, e.g. Combining Tree Barrier. Also hardware implementations may have the advantage of higher <a href="/wiki/Scalability_testing" title="Scalability testing">scalability</a>. </p><p>A Combining Tree Barrier is a hierarchical way of implementing barrier to resolve the <a href="/wiki/Scalability_testing" title="Scalability testing">scalability</a> by avoiding the case that all threads are spinning at the same location.<sup id="cite_ref-:2_4-1" class="reference"><a href="#cite_note-:2-4"><span class="cite-bracket">[</span>4<span class="cite-bracket">]</span></a></sup> </p><p>In k-Tree Barrier, all threads are equally divided into subgroups of k threads and a first-round synchronizations are done within these subgroups. Once all subgroups have done their synchronizations, the first thread in each subgroup enters the second level for further synchronization. In the second level, like in the first level, the threads form new subgroups of k threads and synchronize within groups, sending out one thread in each subgroup to next level and so on. Eventually, in the final level there is only one subgroup to be synchronized. After the final-level synchronization, the releasing signal is transmitted to upper levels and all threads get past the barrier.<sup id="cite_ref-:1_6-1" class="reference"><a href="#cite_note-:1-6"><span class="cite-bracket">[</span>6<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-7" class="reference"><a href="#cite_note-7"><span class="cite-bracket">[</span>7<span class="cite-bracket">]</span></a></sup> </p> <div class="mw-heading mw-heading3"><h3 id="Hardware_Barrier_Implementation">Hardware Barrier Implementation</h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Barrier_(computer_science)&action=edit&section=4" title="Edit section: Hardware Barrier Implementation"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>The hardware barrier uses hardware to implement the above basic barrier model.<sup id="cite_ref-:0_3-2" class="reference"><a href="#cite_note-:0-3"><span class="cite-bracket">[</span>3<span class="cite-bracket">]</span></a></sup> </p><p>The simplest hardware implementation uses dedicated wires to transmit signal to implement barrier. This dedicated wire performs OR/AND operation to act as the pass/block flags and thread counter. For small systems, such a model works and communication speed is not a major concern. In large multiprocessor systems this hardware design can make barrier implementation have high latency. The network connection among processors is one implementation to lower the latency, which is analogous to Combining Tree Barrier.<sup id="cite_ref-8" class="reference"><a href="#cite_note-8"><span class="cite-bracket">[</span>8<span class="cite-bracket">]</span></a></sup> </p> <div class="mw-heading mw-heading2"><h2 id="POSIX_Thread_barrier_functions">POSIX Thread barrier functions</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Barrier_(computer_science)&action=edit&section=5" title="Edit section: POSIX Thread barrier functions"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>POSIX Threads standard directly <b>supports thread barrier functions</b> which can be used to <b>block the specified threads</b> <b>or the whole process at the barrier until other threads to reach that barrier</b>.<sup id="cite_ref-:3_2-1" class="reference"><a href="#cite_note-:3-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup> 3 main API supports by POSIX to implement thread barriers are: </p> <dl><dt><code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">pthread_barrier_init()</code></dt> <dd>Init the thread barrier with the number of threads needed to wait at the barrier in order to lift it<sup id="cite_ref-:4_9-0" class="reference"><a href="#cite_note-:4-9"><span class="cite-bracket">[</span>9<span class="cite-bracket">]</span></a></sup></dd> <dt><code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">pthread_barrier_destroy()</code></dt> <dd>Destroy the thread barrier to release back the resource<sup id="cite_ref-:4_9-1" class="reference"><a href="#cite_note-:4-9"><span class="cite-bracket">[</span>9<span class="cite-bracket">]</span></a></sup></dd> <dt><code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">pthread_barrier_wait()</code></dt> <dd>Calling this function will block the current thread until the number of threads specified by <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">pthread_barrier_init()</code> call <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">pthread_barrier_wait()</code> to lift the barrier.<sup id="cite_ref-10" class="reference"><a href="#cite_note-10"><span class="cite-bracket">[</span>10<span class="cite-bracket">]</span></a></sup></dd></dl><p> The following example (implemented in <a href="/wiki/C_(programming_language)" title="C (programming language)">C</a> with pthread API) will use thread barrier to block all the threads of the main process and therefore block the whole process:</p><div class="mw-highlight mw-highlight-lang-c mw-content-ltr mw-highlight-lines" dir="ltr"><pre><span></span><span class="linenos" data-line="1"></span><span class="cp">#include</span><span class="w"> </span><span class="cpf"><stdio.h></span> <span class="linenos" data-line="2"></span><span class="cp">#include</span><span class="w"> </span><span class="cpf"><pthread.h></span> <span class="linenos" data-line="3"></span> <span class="linenos" data-line="4"></span><span class="cp">#define TOTAL_THREADS 2</span> <span class="linenos" data-line="5"></span><span class="cp">#define THREAD_BARRIERS_NUMBER 3</span> <span class="linenos" data-line="6"></span><span class="cp">#define PTHREAD_BARRIER_ATTR NULL </span><span class="c1">// pthread barrier attribute</span> <span class="linenos" data-line="7"></span> <span class="linenos" data-line="8"></span><span class="n">pthread_barrier_t</span><span class="w"> </span><span class="n">barrier</span><span class="p">;</span> <span class="linenos" data-line="9"></span> <span class="linenos" data-line="10"></span><span class="kt">void</span><span class="w"> </span><span class="o">*</span><span class="nf">thread_func</span><span class="p">(</span><span class="kt">void</span><span class="w"> </span><span class="o">*</span><span class="n">ptr</span><span class="p">){</span> <span class="linenos" data-line="11"></span><span class="w"> </span><span class="n">printf</span><span class="p">(</span><span class="s">"Waiting at the barrier as not enough %d threads are running ...</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span><span class="w"> </span><span class="n">THREAD_BARRIERS_NUMBER</span><span class="p">);</span> <span class="linenos" data-line="12"></span><span class="w"> </span><span class="n">pthread_barrier_wait</span><span class="p">(</span><span class="o">&</span><span class="n">barrier</span><span class="p">);</span> <span class="linenos" data-line="13"></span><span class="w"> </span><span class="n">printf</span><span class="p">(</span><span class="s">"The barrier is lifted, thread id %ld is running now</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span><span class="w"> </span><span class="n">pthread_self</span><span class="p">());</span> <span class="linenos" data-line="14"></span><span class="p">}</span> <span class="linenos" data-line="15"></span> <span class="linenos" data-line="16"></span><span class="kt">int</span><span class="w"> </span><span class="nf">main</span><span class="p">()</span> <span class="linenos" data-line="17"></span><span class="p">{</span><span class="w"> </span> <span class="linenos" data-line="18"></span><span class="w"> </span><span class="n">pthread_t</span><span class="w"> </span><span class="n">thread_id</span><span class="p">[</span><span class="n">TOTAL_THREADS</span><span class="p">];</span> <span class="linenos" data-line="19"></span> <span class="linenos" data-line="20"></span><span class="w"> </span><span class="n">pthread_barrier_init</span><span class="p">(</span><span class="o">&</span><span class="n">barrier</span><span class="p">,</span><span class="w"> </span><span class="n">PTHREAD_BARRIER_ATTR</span><span class="p">,</span><span class="w"> </span><span class="n">THREAD_BARRIERS_NUMBER</span><span class="p">);</span> <span class="linenos" data-line="21"></span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="n">TOTAL_THREADS</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">){</span> <span class="linenos" data-line="22"></span><span class="w"> </span><span class="n">pthread_create</span><span class="p">(</span><span class="o">&</span><span class="n">thread_id</span><span class="p">[</span><span class="n">i</span><span class="p">],</span><span class="w"> </span><span class="nb">NULL</span><span class="p">,</span><span class="w"> </span><span class="n">thread_func</span><span class="p">,</span><span class="w"> </span><span class="nb">NULL</span><span class="p">);</span> <span class="linenos" data-line="23"></span><span class="w"> </span><span class="p">}</span> <span class="linenos" data-line="24"></span> <span class="linenos" data-line="25"></span><span class="w"> </span><span class="c1">// As pthread_join() will block the process until all the threads it specifies are finished, </span> <span class="linenos" data-line="26"></span><span class="w"> </span><span class="c1">// and there is not enough thread to wait at the barrier, so this process is blocked</span> <span class="linenos" data-line="27"></span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="n">TOTAL_THREADS</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">){</span> <span class="linenos" data-line="28"></span><span class="w"> </span><span class="n">pthread_join</span><span class="p">(</span><span class="n">thread_id</span><span class="p">[</span><span class="n">i</span><span class="p">],</span><span class="w"> </span><span class="nb">NULL</span><span class="p">);</span> <span class="linenos" data-line="29"></span><span class="w"> </span><span class="p">}</span> <span class="linenos" data-line="30"></span><span class="w"> </span><span class="n">pthread_barrier_destroy</span><span class="p">(</span><span class="o">&</span><span class="n">barrier</span><span class="p">);</span> <span class="linenos" data-line="31"></span><span class="w"> </span><span class="n">printf</span><span class="p">(</span><span class="s">"Thread barrier is lifted</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span><span class="w"> </span><span class="c1">// This line won't be called as TOTAL_THREADS < THREAD_BARRIERS_NUMBER</span> <span class="linenos" data-line="32"></span><span class="p">}</span> </pre></div><p>The result of that source code is:</p><div class="mw-highlight mw-highlight-lang-output mw-content-ltr" dir="ltr"><pre><span></span><span class="go">Waiting at the barrier as not enough 3 threads are running ...</span> <span class="go">Waiting at the barrier as not enough 3 threads are running ...</span> <span class="go">// (main process is blocked as not having enough 3 threads)</span> <span class="go">// Line printf("Thread barrier is lifted\n") won't be reached</span> </pre></div><p>As we can see from the source code, there are just only two threads are created. Those 2 thread both have thread_func(), as the thread function handler, which call <code class="mw-highlight mw-highlight-lang-c mw-content-ltr" style="" dir="ltr"><span class="n">pthread_barrier_wait</span><span class="p">(</span><span class="o">&</span><span class="n">barrier</span><span class="p">)</span></code>, while thread barrier expected 3 threads to call <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">pthread_barrier_wait</code> (<code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">THREAD_BARRIERS_NUMBER = 3</code>) in order to be lifted. Change TOTAL_THREADS to 3 and the thread barrier is lifted:</p><div class="mw-highlight mw-highlight-lang-output mw-content-ltr" dir="ltr"><pre><span></span><span class="go">Waiting at the barrier as not enough 3 threads are running ...</span> <span class="go">Waiting at the barrier as not enough 3 threads are running ...</span> <span class="go">Waiting at the barrier as not enough 3 threads are running ...</span> <span class="go">The barrier is lifted, thread id 140643372406528 is running now</span> <span class="go">The barrier is lifted, thread id 140643380799232 is running now</span> <span class="go">The barrier is lifted, thread id 140643389191936 is running now</span> <span class="go">Thread barrier is lifted</span> </pre></div><p>As <b>main()</b> <b>is treated as a thread</b>, i.e the "main" thread of the process,<sup id="cite_ref-11" class="reference"><a href="#cite_note-11"><span class="cite-bracket">[</span>11<span class="cite-bracket">]</span></a></sup> calling <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">pthread_barrier_wait()</code> inside <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">main()</code> will block the whole process until other threads reach the barrier. The following example will use thread barrier, with <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">pthread_barrier_wait()</code> inside <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">main()</code>, to block the process/main thread for 5 seconds as waiting the 2 "newly created" thread to reach the thread barrier: </p><div class="mw-highlight mw-highlight-lang-c mw-content-ltr mw-highlight-lines" dir="ltr"><pre><span></span><span class="linenos" data-line="1"></span><span class="cp">#define TOTAL_THREADS 2</span> <span class="linenos" data-line="2"></span><span class="cp">#define THREAD_BARRIERS_NUMBER 3</span> <span class="linenos" data-line="3"></span><span class="cp">#define PTHREAD_BARRIER_ATTR NULL </span><span class="c1">// pthread barrier attribute</span> <span class="linenos" data-line="4"></span> <span class="linenos" data-line="5"></span><span class="n">pthread_barrier_t</span><span class="w"> </span><span class="n">barrier</span><span class="p">;</span> <span class="linenos" data-line="6"></span> <span class="linenos" data-line="7"></span><span class="kt">void</span><span class="w"> </span><span class="o">*</span><span class="nf">thread_func</span><span class="p">(</span><span class="kt">void</span><span class="w"> </span><span class="o">*</span><span class="n">ptr</span><span class="p">){</span> <span class="linenos" data-line="8"></span><span class="w"> </span><span class="n">printf</span><span class="p">(</span><span class="s">"Waiting at the barrier as not enough %d threads are running ...</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span><span class="w"> </span><span class="n">THREAD_BARRIERS_NUMBER</span><span class="p">);</span> <span class="linenos" data-line="9"></span><span class="w"> </span><span class="n">sleep</span><span class="p">(</span><span class="mi">5</span><span class="p">);</span> <span class="linenos" data-line="10"></span><span class="w"> </span><span class="n">pthread_barrier_wait</span><span class="p">(</span><span class="o">&</span><span class="n">barrier</span><span class="p">);</span> <span class="linenos" data-line="11"></span><span class="w"> </span><span class="n">printf</span><span class="p">(</span><span class="s">"The barrier is lifted, thread id %ld is running now</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span><span class="w"> </span><span class="n">pthread_self</span><span class="p">());</span> <span class="linenos" data-line="12"></span><span class="p">}</span> <span class="linenos" data-line="13"></span> <span class="linenos" data-line="14"></span><span class="kt">int</span><span class="w"> </span><span class="nf">main</span><span class="p">()</span> <span class="linenos" data-line="15"></span><span class="p">{</span><span class="w"> </span> <span class="linenos" data-line="16"></span><span class="w"> </span><span class="n">pthread_t</span><span class="w"> </span><span class="n">thread_id</span><span class="p">[</span><span class="n">TOTAL_THREADS</span><span class="p">];</span> <span class="linenos" data-line="17"></span> <span class="linenos" data-line="18"></span><span class="w"> </span><span class="n">pthread_barrier_init</span><span class="p">(</span><span class="o">&</span><span class="n">barrier</span><span class="p">,</span><span class="w"> </span><span class="n">PTHREAD_BARRIER_ATTR</span><span class="p">,</span><span class="w"> </span><span class="n">THREAD_BARRIERS_NUMBER</span><span class="p">);</span> <span class="linenos" data-line="19"></span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="n">TOTAL_THREADS</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">){</span> <span class="linenos" data-line="20"></span><span class="w"> </span><span class="n">pthread_create</span><span class="p">(</span><span class="o">&</span><span class="n">thread_id</span><span class="p">[</span><span class="n">i</span><span class="p">],</span><span class="w"> </span><span class="nb">NULL</span><span class="p">,</span><span class="w"> </span><span class="n">thread_func</span><span class="p">,</span><span class="w"> </span><span class="nb">NULL</span><span class="p">);</span> <span class="linenos" data-line="21"></span><span class="w"> </span><span class="p">}</span> <span class="linenos" data-line="22"></span> <span class="linenos" data-line="23"></span><span class="w"> </span><span class="n">pthread_barrier_wait</span><span class="p">(</span><span class="o">&</span><span class="n">barrier</span><span class="p">);</span> <span class="linenos" data-line="24"></span> <span class="linenos" data-line="25"></span><span class="w"> </span><span class="n">printf</span><span class="p">(</span><span class="s">"Thread barrier is lifted</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span><span class="w"> </span><span class="c1">// This line won't be called as TOTAL_THREADS < THREAD_BARRIERS_NUMBER</span> <span class="linenos" data-line="26"></span><span class="w"> </span><span class="n">pthread_barrier_destroy</span><span class="p">(</span><span class="o">&</span><span class="n">barrier</span><span class="p">);</span> <span class="linenos" data-line="27"></span><span class="p">}</span> </pre></div><p>This example doesn't use <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">pthread_join()</code> to wait for 2 "newly created" threads to complete. It calls <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">pthread_barrier_wait()</code> inside <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">main()</code>, in order to block the main thread, so that the process will be blocked until 2 threads finish its operation after 5 seconds wait (line 9 - <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">sleep(5)</code>). </p><div class="mw-heading mw-heading2"><h2 id="See_also">See also</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Barrier_(computer_science)&action=edit&section=6" title="Edit section: See also"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <ul><li><a href="/wiki/Fork%E2%80%93join_model" title="Fork–join model">Fork–join model</a></li> <li><a href="/wiki/Rendezvous_(Plan_9)" title="Rendezvous (Plan 9)">Rendezvous (Plan 9)</a></li> <li><a href="/wiki/Memory_barrier" title="Memory barrier">Memory barrier</a></li></ul> <div class="mw-heading mw-heading2"><h2 id="References">References</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Barrier_(computer_science)&action=edit&section=7" title="Edit section: References"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <style data-mw-deduplicate="TemplateStyles:r1239543626">.mw-parser-output .reflist{margin-bottom:0.5em;list-style-type:decimal}@media screen{.mw-parser-output .reflist{font-size:90%}}.mw-parser-output .reflist .references{font-size:100%;margin-bottom:0;list-style-type:inherit}.mw-parser-output .reflist-columns-2{column-width:30em}.mw-parser-output .reflist-columns-3{column-width:25em}.mw-parser-output .reflist-columns{margin-top:0.3em}.mw-parser-output .reflist-columns ol{margin-top:0}.mw-parser-output .reflist-columns li{page-break-inside:avoid;break-inside:avoid-column}.mw-parser-output .reflist-upper-alpha{list-style-type:upper-alpha}.mw-parser-output .reflist-upper-roman{list-style-type:upper-roman}.mw-parser-output .reflist-lower-alpha{list-style-type:lower-alpha}.mw-parser-output .reflist-lower-greek{list-style-type:lower-greek}.mw-parser-output .reflist-lower-roman{list-style-type:lower-roman}</style><div class="reflist"> <div class="mw-references-wrap mw-references-columns"><ol class="references"> <li id="cite_note-impl-1"><span class="mw-cite-backlink">^ <a href="#cite_ref-impl_1-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-impl_1-1"><sup><i><b>b</b></i></sup></a> <a href="#cite_ref-impl_1-2"><sup><i><b>c</b></i></sup></a> <a href="#cite_ref-impl_1-3"><sup><i><b>d</b></i></sup></a> <a href="#cite_ref-impl_1-4"><sup><i><b>e</b></i></sup></a></span> <span class="reference-text"><style data-mw-deduplicate="TemplateStyles:r1238218222">.mw-parser-output cite.citation{font-style:inherit;word-wrap:break-word}.mw-parser-output .citation q{quotes:"\"""\"""'""'"}.mw-parser-output .citation:target{background-color:rgba(0,127,255,0.133)}.mw-parser-output .id-lock-free.id-lock-free a{background:url("//upload.wikimedia.org/wikipedia/commons/6/65/Lock-green.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-limited.id-lock-limited a,.mw-parser-output .id-lock-registration.id-lock-registration a{background:url("//upload.wikimedia.org/wikipedia/commons/d/d6/Lock-gray-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-subscription.id-lock-subscription a{background:url("//upload.wikimedia.org/wikipedia/commons/a/aa/Lock-red-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .cs1-ws-icon a{background:url("//upload.wikimedia.org/wikipedia/commons/4/4c/Wikisource-logo.svg")right 0.1em center/12px no-repeat}body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-free a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-limited a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-registration a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-subscription a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .cs1-ws-icon a{background-size:contain;padding:0 1em 0 0}.mw-parser-output .cs1-code{color:inherit;background:inherit;border:none;padding:inherit}.mw-parser-output .cs1-hidden-error{display:none;color:var(--color-error,#d33)}.mw-parser-output .cs1-visible-error{color:var(--color-error,#d33)}.mw-parser-output .cs1-maint{display:none;color:#085;margin-left:0.3em}.mw-parser-output .cs1-kern-left{padding-left:0.2em}.mw-parser-output .cs1-kern-right{padding-right:0.2em}.mw-parser-output .citation .mw-selflink{font-weight:inherit}@media screen{.mw-parser-output .cs1-format{font-size:95%}html.skin-theme-clientpref-night .mw-parser-output .cs1-maint{color:#18911f}}@media screen and (prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output .cs1-maint{color:#18911f}}</style><cite class="citation web cs1"><a rel="nofollow" class="external text" href="http://15418.courses.cs.cmu.edu/spring2013/article/43">"Implementing Barriers"</a>. Carnegie Mellon University.</cite><span title="ctx_ver=Z39.88-2004&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&rft.genre=unknown&rft.btitle=Implementing+Barriers&rft.pub=Carnegie+Mellon+University&rft_id=http%3A%2F%2F15418.courses.cs.cmu.edu%2Fspring2013%2Farticle%2F43&rfr_id=info%3Asid%2Fen.wikipedia.org%3ABarrier+%28computer+science%29" class="Z3988"></span></span> </li> <li id="cite_note-:3-2"><span class="mw-cite-backlink">^ <a href="#cite_ref-:3_2-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-:3_2-1"><sup><i><b>b</b></i></sup></a></span> <span class="reference-text"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1238218222"><cite id="CITEREFGNU_Operating_System" class="citation web cs1">GNU Operating System. <a rel="nofollow" class="external text" href="https://www.gnu.org/software/gnuastro/manual/html_node/Implementation-of-pthread_005fbarrier.html">"Implementation of pthread_barrier"</a>. <i>gnu.org</i><span class="reference-accessdate">. Retrieved <span class="nowrap">2024-03-02</span></span>.</cite><span title="ctx_ver=Z39.88-2004&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal&rft.genre=unknown&rft.jtitle=gnu.org&rft.atitle=Implementation+of+pthread_barrier&rft.au=GNU+Operating+System&rft_id=https%3A%2F%2Fwww.gnu.org%2Fsoftware%2Fgnuastro%2Fmanual%2Fhtml_node%2FImplementation-of-pthread_005fbarrier.html&rfr_id=info%3Asid%2Fen.wikipedia.org%3ABarrier+%28computer+science%29" class="Z3988"></span></span> </li> <li id="cite_note-:0-3"><span class="mw-cite-backlink">^ <a href="#cite_ref-:0_3-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-:0_3-1"><sup><i><b>b</b></i></sup></a> <a href="#cite_ref-:0_3-2"><sup><i><b>c</b></i></sup></a></span> <span class="reference-text"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1238218222"><cite id="CITEREFSolihin2015" class="citation book cs1">Solihin, Yan (2015-01-01). <a rel="nofollow" class="external text" href="http://dl.acm.org/citation.cfm?id=2855046"><i>Fundamentals of Parallel Multicore Architecture</i></a> (1st ed.). Chapman & Hall/CRC. <a href="/wiki/ISBN_(identifier)" class="mw-redirect" title="ISBN (identifier)">ISBN</a> <a href="/wiki/Special:BookSources/978-1482211184" title="Special:BookSources/978-1482211184"><bdi>978-1482211184</bdi></a>.</cite><span title="ctx_ver=Z39.88-2004&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&rft.genre=book&rft.btitle=Fundamentals+of+Parallel+Multicore+Architecture&rft.edition=1st&rft.pub=Chapman+%26+Hall%2FCRC&rft.date=2015-01-01&rft.isbn=978-1482211184&rft.aulast=Solihin&rft.aufirst=Yan&rft_id=http%3A%2F%2Fdl.acm.org%2Fcitation.cfm%3Fid%3D2855046&rfr_id=info%3Asid%2Fen.wikipedia.org%3ABarrier+%28computer+science%29" class="Z3988"></span></span> </li> <li id="cite_note-:2-4"><span class="mw-cite-backlink">^ <a href="#cite_ref-:2_4-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-:2_4-1"><sup><i><b>b</b></i></sup></a></span> <span class="reference-text"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1238218222"><cite id="CITEREFCuller1998" class="citation book cs1">Culler, David (1998). <i>Parallel Computer Architecture, A Hardware/Software Approach</i>. Gulf Professional. <a href="/wiki/ISBN_(identifier)" class="mw-redirect" title="ISBN (identifier)">ISBN</a> <a href="/wiki/Special:BookSources/978-1558603431" title="Special:BookSources/978-1558603431"><bdi>978-1558603431</bdi></a>.</cite><span title="ctx_ver=Z39.88-2004&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&rft.genre=book&rft.btitle=Parallel+Computer+Architecture%2C+A+Hardware%2FSoftware+Approach&rft.pub=Gulf+Professional&rft.date=1998&rft.isbn=978-1558603431&rft.aulast=Culler&rft.aufirst=David&rfr_id=info%3Asid%2Fen.wikipedia.org%3ABarrier+%28computer+science%29" class="Z3988"></span></span> </li> <li id="cite_note-:22-5"><span class="mw-cite-backlink"><b><a href="#cite_ref-:22_5-0">^</a></b></span> <span class="reference-text"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1238218222"><cite id="CITEREFCuller1998" class="citation book cs1">Culler, David (1998). <i>Parallel Computer Architecture, A Hardware/Software Approach</i>. Gulf Professional. <a href="/wiki/ISBN_(identifier)" class="mw-redirect" title="ISBN (identifier)">ISBN</a> <a href="/wiki/Special:BookSources/978-1558603431" title="Special:BookSources/978-1558603431"><bdi>978-1558603431</bdi></a>.</cite><span title="ctx_ver=Z39.88-2004&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&rft.genre=book&rft.btitle=Parallel+Computer+Architecture%2C+A+Hardware%2FSoftware+Approach&rft.pub=Gulf+Professional&rft.date=1998&rft.isbn=978-1558603431&rft.aulast=Culler&rft.aufirst=David&rfr_id=info%3Asid%2Fen.wikipedia.org%3ABarrier+%28computer+science%29" class="Z3988"></span></span> </li> <li id="cite_note-:1-6"><span class="mw-cite-backlink">^ <a href="#cite_ref-:1_6-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-:1_6-1"><sup><i><b>b</b></i></sup></a></span> <span class="reference-text"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1238218222"><cite id="CITEREFNanjegowdaHernandezChapmanJin2009" class="citation book cs1">Nanjegowda, Ramachandra; Hernandez, Oscar; Chapman, Barbara; Jin, Haoqiang H. (2009-06-03). Müller, Matthias S.; Supinski, Bronis R. de; Chapman, Barbara M. (eds.). <span class="id-lock-limited" title="Free access subject to limited trial, subscription normally required"><a rel="nofollow" class="external text" href="https://archive.org/details/evolvingopenmpag00mlle"><i>Evolving OpenMP in an Age of Extreme Parallelism</i></a></span>. Lecture Notes in Computer Science. Springer Berlin Heidelberg. pp. <a rel="nofollow" class="external text" href="https://archive.org/details/evolvingopenmpag00mlle/page/n49">42</a>–52. <a href="/wiki/Doi_(identifier)" class="mw-redirect" title="Doi (identifier)">doi</a>:<a rel="nofollow" class="external text" href="https://doi.org/10.1007%2F978-3-642-02303-3_4">10.1007/978-3-642-02303-3_4</a>. <a href="/wiki/ISBN_(identifier)" class="mw-redirect" title="ISBN (identifier)">ISBN</a> <a href="/wiki/Special:BookSources/9783642022845" title="Special:BookSources/9783642022845"><bdi>9783642022845</bdi></a>.</cite><span title="ctx_ver=Z39.88-2004&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&rft.genre=book&rft.btitle=Evolving+OpenMP+in+an+Age+of+Extreme+Parallelism&rft.series=Lecture+Notes+in+Computer+Science&rft.pages=42-52&rft.pub=Springer+Berlin+Heidelberg&rft.date=2009-06-03&rft_id=info%3Adoi%2F10.1007%2F978-3-642-02303-3_4&rft.isbn=9783642022845&rft.aulast=Nanjegowda&rft.aufirst=Ramachandra&rft.au=Hernandez%2C+Oscar&rft.au=Chapman%2C+Barbara&rft.au=Jin%2C+Haoqiang+H.&rft_id=https%3A%2F%2Farchive.org%2Fdetails%2Fevolvingopenmpag00mlle&rfr_id=info%3Asid%2Fen.wikipedia.org%3ABarrier+%28computer+science%29" class="Z3988"></span></span> </li> <li id="cite_note-7"><span class="mw-cite-backlink"><b><a href="#cite_ref-7">^</a></b></span> <span class="reference-text"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1238218222"><cite id="CITEREFNikolopoulosPapatheodorou1999" class="citation book cs1">Nikolopoulos, Dimitrios S.; Papatheodorou, Theodore S. (1999-01-01). "A quantitative architectural evaluation of synchronization algorithms and disciplines on ccNUMA systems". <a rel="nofollow" class="external text" href="https://web.archive.org/web/20170725025227/http://pure.qub.ac.uk/portal/en/publications/a-quantitative-evaluation-of-synchronization-algorithms-and-disciplines-on-ccnuma-systems-the-case-of-the-sgi-origin2000(2b9278d2-85fc-4ce9-96ed-725524379f9a).html"><i>Proceedings of the 13th international conference on Supercomputing</i></a>. ICS '99. New York, NY, USA: ACM. pp. 319–328. <a href="/wiki/Doi_(identifier)" class="mw-redirect" title="Doi (identifier)">doi</a>:<a rel="nofollow" class="external text" href="https://doi.org/10.1145%2F305138.305209">10.1145/305138.305209</a>. <a href="/wiki/ISBN_(identifier)" class="mw-redirect" title="ISBN (identifier)">ISBN</a> <a href="/wiki/Special:BookSources/978-1581131642" title="Special:BookSources/978-1581131642"><bdi>978-1581131642</bdi></a>. <a href="/wiki/S2CID_(identifier)" class="mw-redirect" title="S2CID (identifier)">S2CID</a> <a rel="nofollow" class="external text" href="https://api.semanticscholar.org/CorpusID:6097544">6097544</a>. Archived from <a rel="nofollow" class="external text" href="https://pure.qub.ac.uk/portal/en/publications/a-quantitative-evaluation-of-synchronization-algorithms-and-disciplines-on-ccnuma-systems-the-case-of-the-sgi-origin2000(2b9278d2-85fc-4ce9-96ed-725524379f9a).html">the original</a> on 2017-07-25<span class="reference-accessdate">. Retrieved <span class="nowrap">2019-01-18</span></span>.</cite><span title="ctx_ver=Z39.88-2004&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&rft.genre=bookitem&rft.atitle=A+quantitative+architectural+evaluation+of+synchronization+algorithms+and+disciplines+on+ccNUMA+systems&rft.btitle=Proceedings+of+the+13th+international+conference+on+Supercomputing&rft.place=New+York%2C+NY%2C+USA&rft.series=ICS+%2799&rft.pages=319-328&rft.pub=ACM&rft.date=1999-01-01&rft_id=https%3A%2F%2Fapi.semanticscholar.org%2FCorpusID%3A6097544%23id-name%3DS2CID&rft_id=info%3Adoi%2F10.1145%2F305138.305209&rft.isbn=978-1581131642&rft.aulast=Nikolopoulos&rft.aufirst=Dimitrios+S.&rft.au=Papatheodorou%2C+Theodore+S.&rft_id=https%3A%2F%2Fpure.qub.ac.uk%2Fportal%2Fen%2Fpublications%2Fa-quantitative-evaluation-of-synchronization-algorithms-and-disciplines-on-ccnuma-systems-the-case-of-the-sgi-origin2000%282b9278d2-85fc-4ce9-96ed-725524379f9a%29.html&rfr_id=info%3Asid%2Fen.wikipedia.org%3ABarrier+%28computer+science%29" class="Z3988"></span></span> </li> <li id="cite_note-8"><span class="mw-cite-backlink"><b><a href="#cite_ref-8">^</a></b></span> <span class="reference-text">N.R. Adiga, et al. An Overview of the BlueGene/L Supercomputer. <i>Proceedings of the Conference on High Performance Networking and Computing,</i> 2002.</span> </li> <li id="cite_note-:4-9"><span class="mw-cite-backlink">^ <a href="#cite_ref-:4_9-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-:4_9-1"><sup><i><b>b</b></i></sup></a></span> <span class="reference-text"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1238218222"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://linux.die.net/man/3/pthread_barrier_init">"pthread_barrier_init(), pthread_barrier_destroy()"</a>. <i>Linux man page</i><span class="reference-accessdate">. Retrieved <span class="nowrap">2024-03-16</span></span>.</cite><span title="ctx_ver=Z39.88-2004&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal&rft.genre=unknown&rft.jtitle=Linux+man+page&rft.atitle=pthread_barrier_init%28%29%2C+pthread_barrier_destroy%28%29&rft_id=https%3A%2F%2Flinux.die.net%2Fman%2F3%2Fpthread_barrier_init&rfr_id=info%3Asid%2Fen.wikipedia.org%3ABarrier+%28computer+science%29" class="Z3988"></span></span> </li> <li id="cite_note-10"><span class="mw-cite-backlink"><b><a href="#cite_ref-10">^</a></b></span> <span class="reference-text"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1238218222"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://linux.die.net/man/3/pthread_barrier_wait">"pthread_barrier_wait()"</a>. <i>Linux man page</i><span class="reference-accessdate">. Retrieved <span class="nowrap">2024-03-16</span></span>.</cite><span title="ctx_ver=Z39.88-2004&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal&rft.genre=unknown&rft.jtitle=Linux+man+page&rft.atitle=pthread_barrier_wait%28%29&rft_id=https%3A%2F%2Flinux.die.net%2Fman%2F3%2Fpthread_barrier_wait&rfr_id=info%3Asid%2Fen.wikipedia.org%3ABarrier+%28computer+science%29" class="Z3988"></span></span> </li> <li id="cite_note-11"><span class="mw-cite-backlink"><b><a href="#cite_ref-11">^</a></b></span> <span class="reference-text"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1238218222"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://stackoverflow.com/questions/52758132/how-to-get-number-of-processes-and-threads-in-a-c-program">"How to get number of processes and threads in a C program?"</a>. <i><a href="/wiki/Stackoverflow" class="mw-redirect" title="Stackoverflow">stackoverflow</a></i><span class="reference-accessdate">. Retrieved <span class="nowrap">2024-03-16</span></span>.</cite><span title="ctx_ver=Z39.88-2004&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal&rft.genre=unknown&rft.jtitle=stackoverflow&rft.atitle=How+to+get+number+of+processes+and+threads+in+a+C+program%3F&rft_id=https%3A%2F%2Fstackoverflow.com%2Fquestions%2F52758132%2Fhow-to-get-number-of-processes-and-threads-in-a-c-program&rfr_id=info%3Asid%2Fen.wikipedia.org%3ABarrier+%28computer+science%29" class="Z3988"></span></span> </li> </ol></div></div> <div class="mw-heading mw-heading2"><h2 id="External_links">External links</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Barrier_(computer_science)&action=edit&section=8" title="Edit section: External links"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1238218222"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="http://blogs.sourceallies.com/2012/03/parallel-programming-with-barrier-synchronization/">"Parallel Programming with Barrier Synchronization"</a>. <i>sourceallies.com</i>. March 2012.</cite><span title="ctx_ver=Z39.88-2004&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal&rft.genre=unknown&rft.jtitle=sourceallies.com&rft.atitle=Parallel+Programming+with+Barrier+Synchronization&rft.date=2012-03&rft_id=http%3A%2F%2Fblogs.sourceallies.com%2F2012%2F03%2Fparallel-programming-with-barrier-synchronization%2F&rfr_id=info%3Asid%2Fen.wikipedia.org%3ABarrier+%28computer+science%29" class="Z3988"></span> </p> <div class="navbox-styles"><style data-mw-deduplicate="TemplateStyles:r1129693374">.mw-parser-output .hlist dl,.mw-parser-output .hlist ol,.mw-parser-output .hlist ul{margin:0;padding:0}.mw-parser-output .hlist dd,.mw-parser-output .hlist dt,.mw-parser-output .hlist li{margin:0;display:inline}.mw-parser-output .hlist.inline,.mw-parser-output .hlist.inline dl,.mw-parser-output .hlist.inline ol,.mw-parser-output .hlist.inline ul,.mw-parser-output .hlist dl dl,.mw-parser-output .hlist dl ol,.mw-parser-output .hlist dl ul,.mw-parser-output .hlist ol dl,.mw-parser-output .hlist ol ol,.mw-parser-output .hlist ol ul,.mw-parser-output .hlist ul dl,.mw-parser-output .hlist ul ol,.mw-parser-output .hlist ul ul{display:inline}.mw-parser-output .hlist .mw-empty-li{display:none}.mw-parser-output .hlist dt::after{content:": "}.mw-parser-output .hlist dd::after,.mw-parser-output .hlist li::after{content:" · ";font-weight:bold}.mw-parser-output .hlist dd:last-child::after,.mw-parser-output .hlist dt:last-child::after,.mw-parser-output .hlist li:last-child::after{content:none}.mw-parser-output .hlist dd dd:first-child::before,.mw-parser-output .hlist dd dt:first-child::before,.mw-parser-output .hlist dd li:first-child::before,.mw-parser-output .hlist dt dd:first-child::before,.mw-parser-output .hlist dt dt:first-child::before,.mw-parser-output .hlist dt li:first-child::before,.mw-parser-output .hlist li dd:first-child::before,.mw-parser-output .hlist li dt:first-child::before,.mw-parser-output .hlist li li:first-child::before{content:" (";font-weight:normal}.mw-parser-output .hlist dd dd:last-child::after,.mw-parser-output .hlist dd dt:last-child::after,.mw-parser-output .hlist dd li:last-child::after,.mw-parser-output .hlist dt dd:last-child::after,.mw-parser-output .hlist dt dt:last-child::after,.mw-parser-output .hlist dt li:last-child::after,.mw-parser-output .hlist li dd:last-child::after,.mw-parser-output .hlist li dt:last-child::after,.mw-parser-output .hlist li li:last-child::after{content:")";font-weight:normal}.mw-parser-output .hlist ol{counter-reset:listitem}.mw-parser-output .hlist ol>li{counter-increment:listitem}.mw-parser-output .hlist ol>li::before{content:" "counter(listitem)"\a0 "}.mw-parser-output .hlist dd ol>li:first-child::before,.mw-parser-output .hlist dt ol>li:first-child::before,.mw-parser-output .hlist li ol>li:first-child::before{content:" ("counter(listitem)"\a0 "}</style><style data-mw-deduplicate="TemplateStyles:r1236075235">.mw-parser-output .navbox{box-sizing:border-box;border:1px solid #a2a9b1;width:100%;clear:both;font-size:88%;text-align:center;padding:1px;margin:1em auto 0}.mw-parser-output .navbox .navbox{margin-top:0}.mw-parser-output .navbox+.navbox,.mw-parser-output .navbox+.navbox-styles+.navbox{margin-top:-1px}.mw-parser-output .navbox-inner,.mw-parser-output .navbox-subgroup{width:100%}.mw-parser-output .navbox-group,.mw-parser-output .navbox-title,.mw-parser-output .navbox-abovebelow{padding:0.25em 1em;line-height:1.5em;text-align:center}.mw-parser-output .navbox-group{white-space:nowrap;text-align:right}.mw-parser-output .navbox,.mw-parser-output .navbox-subgroup{background-color:#fdfdfd}.mw-parser-output .navbox-list{line-height:1.5em;border-color:#fdfdfd}.mw-parser-output .navbox-list-with-group{text-align:left;border-left-width:2px;border-left-style:solid}.mw-parser-output tr+tr>.navbox-abovebelow,.mw-parser-output tr+tr>.navbox-group,.mw-parser-output tr+tr>.navbox-image,.mw-parser-output tr+tr>.navbox-list{border-top:2px solid #fdfdfd}.mw-parser-output .navbox-title{background-color:#ccf}.mw-parser-output .navbox-abovebelow,.mw-parser-output .navbox-group,.mw-parser-output .navbox-subgroup .navbox-title{background-color:#ddf}.mw-parser-output .navbox-subgroup .navbox-group,.mw-parser-output .navbox-subgroup .navbox-abovebelow{background-color:#e6e6ff}.mw-parser-output .navbox-even{background-color:#f7f7f7}.mw-parser-output .navbox-odd{background-color:transparent}.mw-parser-output .navbox .hlist td dl,.mw-parser-output .navbox .hlist td ol,.mw-parser-output .navbox .hlist td ul,.mw-parser-output .navbox td.hlist dl,.mw-parser-output .navbox td.hlist ol,.mw-parser-output .navbox td.hlist ul{padding:0.125em 0}.mw-parser-output .navbox .navbar{display:block;font-size:100%}.mw-parser-output .navbox-title .navbar{float:left;text-align:left;margin-right:0.5em}body.skin--responsive .mw-parser-output .navbox-image img{max-width:none!important}@media print{body.ns-0 .mw-parser-output .navbox{display:none!important}}</style></div><div role="navigation" class="navbox" aria-labelledby="Concurrent_computing" style="padding:3px"><table class="nowraplinks hlist mw-collapsible autocollapse navbox-inner" style="border-spacing:0;background:transparent;color:inherit"><tbody><tr><th scope="col" class="navbox-title" colspan="2"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1129693374"><style data-mw-deduplicate="TemplateStyles:r1239400231">.mw-parser-output .navbar{display:inline;font-size:88%;font-weight:normal}.mw-parser-output .navbar-collapse{float:left;text-align:left}.mw-parser-output .navbar-boxtext{word-spacing:0}.mw-parser-output .navbar ul{display:inline-block;white-space:nowrap;line-height:inherit}.mw-parser-output .navbar-brackets::before{margin-right:-0.125em;content:"[ "}.mw-parser-output .navbar-brackets::after{margin-left:-0.125em;content:" ]"}.mw-parser-output .navbar li{word-spacing:-0.125em}.mw-parser-output .navbar a>span,.mw-parser-output .navbar a>abbr{text-decoration:inherit}.mw-parser-output .navbar-mini abbr{font-variant:small-caps;border-bottom:none;text-decoration:none;cursor:inherit}.mw-parser-output .navbar-ct-full{font-size:114%;margin:0 7em}.mw-parser-output .navbar-ct-mini{font-size:114%;margin:0 4em}html.skin-theme-clientpref-night .mw-parser-output .navbar li a abbr{color:var(--color-base)!important}@media(prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output .navbar li a abbr{color:var(--color-base)!important}}@media print{.mw-parser-output .navbar{display:none!important}}</style><div class="navbar plainlinks hlist navbar-mini"><ul><li class="nv-view"><a href="/wiki/Template:Concurrent_computing" title="Template:Concurrent computing"><abbr title="View this template">v</abbr></a></li><li class="nv-talk"><a href="/wiki/Template_talk:Concurrent_computing" title="Template talk:Concurrent computing"><abbr title="Discuss this template">t</abbr></a></li><li class="nv-edit"><a href="/wiki/Special:EditPage/Template:Concurrent_computing" title="Special:EditPage/Template:Concurrent computing"><abbr title="Edit this template">e</abbr></a></li></ul></div><div id="Concurrent_computing" style="font-size:114%;margin:0 4em"><a href="/wiki/Concurrent_computing" title="Concurrent computing">Concurrent computing</a></div></th></tr><tr><th scope="row" class="navbox-group" style="width:1%">General</th><td class="navbox-list-with-group navbox-list navbox-odd" style="width:100%;padding:0"><div style="padding:0 0.25em"> <ul><li><a href="/wiki/Concurrency_(computer_science)" title="Concurrency (computer science)">Concurrency</a></li> <li><a href="/wiki/Concurrency_control" title="Concurrency control">Concurrency control</a></li> <li><a href="/wiki/Concurrent_data_structure" title="Concurrent data structure">Concurrent data structures</a> <ul><li><a href="/wiki/Concurrent_hash_table" title="Concurrent hash table">Concurrent hash tables</a></li></ul></li> <li><a href="/wiki/Concurrent_user" title="Concurrent user">Concurrent users</a></li> <li><a href="/wiki/Indeterminacy_in_concurrent_computation" title="Indeterminacy in concurrent computation">Indeterminacy</a></li> <li><a href="/wiki/Linearizability" title="Linearizability">Linearizability</a></li></ul> </div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%"><a href="/wiki/Process_calculus" title="Process calculus">Process calculi</a></th><td class="navbox-list-with-group navbox-list navbox-even" style="width:100%;padding:0"><div style="padding:0 0.25em"> <ul><li><a href="/wiki/Communicating_sequential_processes" title="Communicating sequential processes">CSP</a></li> <li><a href="/wiki/Calculus_of_communicating_systems" title="Calculus of communicating systems">CCS</a></li> <li><a href="/wiki/Algebra_of_Communicating_Processes" class="mw-redirect" title="Algebra of Communicating Processes">ACP</a></li> <li><a href="/wiki/Language_Of_Temporal_Ordering_Specification" class="mw-redirect" title="Language Of Temporal Ordering Specification">LOTOS</a></li> <li><a href="/wiki/%CE%A0-calculus" title="Π-calculus">π-calculus</a></li> <li><a href="/wiki/Ambient_calculus" title="Ambient calculus">Ambient calculus</a></li> <li><a href="/wiki/API-Calculus" title="API-Calculus">API-Calculus</a></li> <li><a href="/wiki/PEPA" title="PEPA">PEPA</a></li> <li><a href="/wiki/Join-calculus" title="Join-calculus">Join-calculus</a></li></ul> </div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%">Classic problems</th><td class="navbox-list-with-group navbox-list navbox-odd" style="width:100%;padding:0"><div style="padding:0 0.25em"> <ul><li><a href="/wiki/ABA_problem" title="ABA problem">ABA problem</a></li> <li><a href="/wiki/Cigarette_smokers_problem" title="Cigarette smokers problem">Cigarette smokers problem</a></li> <li><a href="/wiki/Deadlock_(computer_science)" title="Deadlock (computer science)">Deadlock</a></li> <li><a href="/wiki/Dining_philosophers_problem" title="Dining philosophers problem">Dining philosophers problem</a></li> <li><a href="/wiki/Producer%E2%80%93consumer_problem" title="Producer–consumer problem">Producer–consumer problem</a></li> <li><a href="/wiki/Race_condition" title="Race condition">Race condition</a></li> <li><a href="/wiki/Readers%E2%80%93writers_problem" title="Readers–writers problem">Readers–writers problem</a></li> <li><a href="/wiki/Sleeping_barber_problem" title="Sleeping barber problem">Sleeping barber problem</a></li></ul> </div></td></tr><tr><td class="navbox-abovebelow" colspan="2"><div> <ul><li><span class="noviewer" typeof="mw:File"><span title="Category"><img alt="" src="//upload.wikimedia.org/wikipedia/en/thumb/9/96/Symbol_category_class.svg/16px-Symbol_category_class.svg.png" decoding="async" width="16" height="16" class="mw-file-element" srcset="//upload.wikimedia.org/wikipedia/en/thumb/9/96/Symbol_category_class.svg/23px-Symbol_category_class.svg.png 1.5x, //upload.wikimedia.org/wikipedia/en/thumb/9/96/Symbol_category_class.svg/31px-Symbol_category_class.svg.png 2x" data-file-width="180" data-file-height="185" /></span></span> <a href="/wiki/Category:Concurrent_computing" title="Category:Concurrent computing">Category: Concurrent computing</a></li></ul> </div></td></tr></tbody></table></div> <div class="navbox-styles"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1129693374"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1236075235"></div><div role="navigation" class="navbox" aria-labelledby="Parallel_computing" style="padding:3px"><table class="nowraplinks hlist mw-collapsible autocollapse navbox-inner" style="border-spacing:0;background:transparent;color:inherit"><tbody><tr><th scope="col" class="navbox-title" colspan="2"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1129693374"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1239400231"><div class="navbar plainlinks hlist navbar-mini"><ul><li class="nv-view"><a href="/wiki/Template:Parallel_computing" title="Template:Parallel computing"><abbr title="View this template">v</abbr></a></li><li class="nv-talk"><a href="/wiki/Template_talk:Parallel_computing" title="Template talk:Parallel computing"><abbr title="Discuss this template">t</abbr></a></li><li class="nv-edit"><a href="/wiki/Special:EditPage/Template:Parallel_computing" title="Special:EditPage/Template:Parallel computing"><abbr title="Edit this template">e</abbr></a></li></ul></div><div id="Parallel_computing" style="font-size:114%;margin:0 4em"><a href="/wiki/Parallel_computing" title="Parallel computing">Parallel computing</a></div></th></tr><tr><th scope="row" class="navbox-group" style="width:1%">General</th><td class="navbox-list-with-group navbox-list navbox-odd" style="width:100%;padding:0"><div style="padding:0 0.25em"> <ul><li><a href="/wiki/Distributed_computing" title="Distributed computing">Distributed computing</a></li> <li><a href="/wiki/Parallel_computing" title="Parallel computing">Parallel computing</a></li> <li><a href="/wiki/Massively_parallel" title="Massively parallel">Massively parallel</a></li> <li><a href="/wiki/Cloud_computing" title="Cloud computing">Cloud computing</a></li> <li><a href="/wiki/High-performance_computing" title="High-performance computing">High-performance computing</a></li> <li><a href="/wiki/Multiprocessing" title="Multiprocessing">Multiprocessing</a></li> <li><a href="/wiki/Manycore_processor" title="Manycore processor">Manycore processor</a></li> <li><a href="/wiki/General-purpose_computing_on_graphics_processing_units" title="General-purpose computing on graphics processing units">GPGPU</a></li> <li><a href="/wiki/Computer_network" title="Computer network">Computer network</a></li> <li><a href="/wiki/Systolic_array" title="Systolic array">Systolic array</a></li></ul> </div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%">Levels</th><td class="navbox-list-with-group navbox-list navbox-even" style="width:100%;padding:0"><div style="padding:0 0.25em"> <ul><li><a href="/wiki/Bit-level_parallelism" title="Bit-level parallelism">Bit</a></li> <li><a href="/wiki/Instruction-level_parallelism" title="Instruction-level parallelism">Instruction</a></li> <li><a href="/wiki/Task_parallelism" title="Task parallelism">Thread</a></li> <li><a href="/wiki/Task_parallelism" title="Task parallelism">Task</a></li> <li><a href="/wiki/Data_parallelism" title="Data parallelism">Data</a></li> <li><a href="/wiki/Memory-level_parallelism" title="Memory-level parallelism">Memory</a></li> <li><a href="/wiki/Loop-level_parallelism" title="Loop-level parallelism">Loop</a></li> <li><a href="/wiki/Pipeline_(computing)" title="Pipeline (computing)">Pipeline</a></li></ul> </div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%"><a href="/wiki/Multithreading_(computer_architecture)" title="Multithreading (computer architecture)">Multithreading</a></th><td class="navbox-list-with-group navbox-list navbox-odd" style="width:100%;padding:0"><div style="padding:0 0.25em"> <ul><li><a href="/wiki/Temporal_multithreading" title="Temporal multithreading">Temporal</a></li> <li><a href="/wiki/Simultaneous_multithreading" title="Simultaneous multithreading">Simultaneous</a> (SMT)</li> <li><a href="/wiki/Simultaneous_and_heterogeneous_multithreading" title="Simultaneous and heterogeneous multithreading">Simultaneous and heterogenous</a></li> <li><a href="/wiki/Speculative_multithreading" title="Speculative multithreading">Speculative</a> (SpMT)</li> <li><a href="/wiki/Preemption_(computing)" title="Preemption (computing)">Preemptive</a></li> <li><a href="/wiki/Computer_multitasking#Cooperative_multitasking" title="Computer multitasking">Cooperative</a></li> <li><a href="/wiki/Bulldozer_(microarchitecture)#Bulldozer_core" title="Bulldozer (microarchitecture)">Clustered multi-thread</a> (CMT)</li> <li><a href="/wiki/Hardware_scout" title="Hardware scout">Hardware scout</a></li></ul> </div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%">Theory</th><td class="navbox-list-with-group navbox-list navbox-even" style="width:100%;padding:0"><div style="padding:0 0.25em"> <ul><li><a href="/wiki/Parallel_RAM" title="Parallel RAM">PRAM model</a></li> <li><a href="/wiki/Parallel_external_memory" title="Parallel external memory">PEM model</a></li> <li><a href="/wiki/Analysis_of_parallel_algorithms" title="Analysis of parallel algorithms">Analysis of parallel algorithms</a></li> <li><a href="/wiki/Amdahl%27s_law" title="Amdahl's law">Amdahl's law</a></li> <li><a href="/wiki/Gustafson%27s_law" title="Gustafson's law">Gustafson's law</a></li> <li><a href="/wiki/Cost_efficiency" title="Cost efficiency">Cost efficiency</a></li> <li><a href="/wiki/Karp%E2%80%93Flatt_metric" title="Karp–Flatt metric">Karp–Flatt metric</a></li> <li><a href="/wiki/Parallel_slowdown" title="Parallel slowdown">Slowdown</a></li> <li><a href="/wiki/Speedup" title="Speedup">Speedup</a></li></ul> </div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%">Elements</th><td class="navbox-list-with-group navbox-list navbox-odd" style="width:100%;padding:0"><div style="padding:0 0.25em"> <ul><li><a href="/wiki/Process_(computing)" title="Process (computing)">Process</a></li> <li><a href="/wiki/Thread_(computing)" title="Thread (computing)">Thread</a></li> <li><a href="/wiki/Fiber_(computer_science)" title="Fiber (computer science)">Fiber</a></li> <li><a href="/wiki/Instruction_window" title="Instruction window">Instruction window</a></li> <li><a href="/wiki/Array_(data_structure)" title="Array (data structure)">Array</a></li></ul> </div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%">Coordination</th><td class="navbox-list-with-group navbox-list navbox-even" style="width:100%;padding:0"><div style="padding:0 0.25em"> <ul><li><a href="/wiki/Multiprocessing" title="Multiprocessing">Multiprocessing</a></li> <li><a href="/wiki/Memory_coherence" title="Memory coherence">Memory coherence</a></li> <li><a href="/wiki/Cache_coherence" title="Cache coherence">Cache coherence</a></li> <li><a href="/wiki/Cache_invalidation" title="Cache invalidation">Cache invalidation</a></li> <li><a class="mw-selflink selflink">Barrier</a></li> <li><a href="/wiki/Synchronization_(computer_science)" title="Synchronization (computer science)">Synchronization</a></li> <li><a href="/wiki/Application_checkpointing" title="Application checkpointing">Application checkpointing</a></li></ul> </div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%"><a href="/wiki/Computer_programming" title="Computer programming">Programming</a></th><td class="navbox-list-with-group navbox-list navbox-odd" style="width:100%;padding:0"><div style="padding:0 0.25em"> <ul><li><a href="/wiki/Stream_processing" title="Stream processing">Stream processing</a></li> <li><a href="/wiki/Dataflow_programming" title="Dataflow programming">Dataflow programming</a></li> <li><a href="/wiki/Parallel_programming_model" title="Parallel programming model">Models</a> <ul><li><a href="/wiki/Implicit_parallelism" title="Implicit parallelism">Implicit parallelism</a></li> <li><a href="/wiki/Explicit_parallelism" title="Explicit parallelism">Explicit parallelism</a></li> <li><a href="/wiki/Concurrency_(computer_science)" title="Concurrency (computer science)">Concurrency</a></li></ul></li> <li><a href="/wiki/Non-blocking_algorithm" title="Non-blocking algorithm">Non-blocking algorithm</a></li></ul> </div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%"><a href="/wiki/Computer_hardware" title="Computer hardware">Hardware</a></th><td class="navbox-list-with-group navbox-list navbox-even" style="width:100%;padding:0"><div style="padding:0 0.25em"> <ul><li><a href="/wiki/Flynn%27s_taxonomy" title="Flynn's taxonomy">Flynn's taxonomy</a> <ul><li><a href="/wiki/Single_instruction,_single_data" title="Single instruction, single data">SISD</a></li> <li><a href="/wiki/Single_instruction,_multiple_data" title="Single instruction, multiple data">SIMD</a> <ul><li><a href="/wiki/Single_instruction,_multiple_threads" title="Single instruction, multiple threads">Array processing</a> (SIMT)</li> <li><a href="/wiki/Flynn%27s_taxonomy#Pipelined_processor" title="Flynn's taxonomy">Pipelined processing</a></li> <li><a href="/wiki/Flynn%27s_taxonomy#Associative_processor" title="Flynn's taxonomy">Associative processing</a></li></ul></li> <li><a href="/wiki/Multiple_instruction,_single_data" title="Multiple instruction, single data">MISD</a></li> <li><a href="/wiki/Multiple_instruction,_multiple_data" title="Multiple instruction, multiple data">MIMD</a></li></ul></li> <li><a href="/wiki/Dataflow_architecture" title="Dataflow architecture">Dataflow architecture</a></li> <li><a href="/wiki/Instruction_pipelining" title="Instruction pipelining">Pipelined processor</a></li> <li><a href="/wiki/Superscalar_processor" title="Superscalar processor">Superscalar processor</a></li> <li><a href="/wiki/Vector_processor" title="Vector processor">Vector processor</a></li> <li><a href="/wiki/Multiprocessing" title="Multiprocessing">Multiprocessor</a> <ul><li><a href="/wiki/Symmetric_multiprocessing" title="Symmetric multiprocessing">symmetric</a></li> <li><a href="/wiki/Asymmetric_multiprocessing" title="Asymmetric multiprocessing">asymmetric</a></li></ul></li> <li><a href="/wiki/Semiconductor_memory" title="Semiconductor memory">Memory</a> <ul><li><a href="/wiki/Shared_memory" title="Shared memory">shared</a></li> <li><a href="/wiki/Distributed_memory" title="Distributed memory">distributed</a></li> <li><a href="/wiki/Distributed_shared_memory" title="Distributed shared memory">distributed shared</a></li> <li><a href="/wiki/Uniform_memory_access" title="Uniform memory access">UMA</a></li> <li><a href="/wiki/Non-uniform_memory_access" title="Non-uniform memory access">NUMA</a></li> <li><a href="/wiki/Cache-only_memory_architecture" title="Cache-only memory architecture">COMA</a></li></ul></li> <li><a href="/wiki/Massively_parallel" title="Massively parallel">Massively parallel</a> computer</li> <li><a href="/wiki/Computer_cluster" title="Computer cluster">Computer cluster</a> <ul><li><a href="/wiki/Beowulf_cluster" title="Beowulf cluster">Beowulf cluster</a></li></ul></li> <li><a href="/wiki/Grid_computing" title="Grid computing">Grid computer</a></li> <li><a href="/wiki/Hardware_acceleration" title="Hardware acceleration">Hardware acceleration</a></li></ul> </div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%"><a href="/wiki/API" title="API">APIs</a></th><td class="navbox-list-with-group navbox-list navbox-odd" style="width:100%;padding:0"><div style="padding:0 0.25em"> <ul><li><a href="/wiki/Ateji_PX" title="Ateji PX">Ateji PX</a></li> <li><a href="/wiki/Boost_(C%2B%2B_libraries)" title="Boost (C++ libraries)">Boost</a></li> <li><a href="/wiki/Chapel_(programming_language)" title="Chapel (programming language)">Chapel</a></li> <li><a href="/wiki/HPX" title="HPX">HPX</a></li> <li><a href="/wiki/Charm%2B%2B" title="Charm++">Charm++</a></li> <li><a href="/wiki/Cilk" title="Cilk">Cilk</a></li> <li><a href="/wiki/Coarray_Fortran" title="Coarray Fortran">Coarray Fortran</a></li> <li><a href="/wiki/CUDA" title="CUDA">CUDA</a></li> <li><a href="/wiki/Dryad_(programming)" title="Dryad (programming)">Dryad</a></li> <li><a href="/wiki/C%2B%2B_AMP" title="C++ AMP">C++ AMP</a></li> <li><a href="/wiki/Global_Arrays" title="Global Arrays">Global Arrays</a></li> <li><a href="/wiki/GPUOpen" title="GPUOpen">GPUOpen</a></li> <li><a href="/wiki/Message_Passing_Interface" title="Message Passing Interface">MPI</a></li> <li><a href="/wiki/OpenMP" title="OpenMP">OpenMP</a></li> <li><a href="/wiki/OpenCL" title="OpenCL">OpenCL</a></li> <li><a href="/wiki/OpenHMPP" title="OpenHMPP">OpenHMPP</a></li> <li><a href="/wiki/OpenACC" title="OpenACC">OpenACC</a></li> <li><a href="/wiki/Parallel_Extensions" title="Parallel Extensions">Parallel Extensions</a></li> <li><a href="/wiki/Parallel_Virtual_Machine" title="Parallel Virtual Machine">PVM</a></li> <li><a href="/wiki/Pthreads" title="Pthreads">pthreads</a></li> <li><a href="/wiki/RaftLib" title="RaftLib">RaftLib</a></li> <li><a href="/wiki/ROCm" title="ROCm">ROCm</a></li> <li><a href="/wiki/Unified_Parallel_C" title="Unified Parallel C">UPC</a></li> <li><a href="/wiki/Threading_Building_Blocks" title="Threading Building Blocks">TBB</a></li> <li><a href="/wiki/ZPL_(programming_language)" class="mw-redirect" title="ZPL (programming language)">ZPL</a></li></ul> </div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%">Problems</th><td class="navbox-list-with-group navbox-list navbox-even" style="width:100%;padding:0"><div style="padding:0 0.25em"> <ul><li><a href="/wiki/Automatic_parallelization" title="Automatic parallelization">Automatic parallelization</a></li> <li><a href="/wiki/Deadlock_(computer_science)" title="Deadlock (computer science)">Deadlock</a></li> <li><a href="/wiki/Deterministic_algorithm" title="Deterministic algorithm">Deterministic algorithm</a></li> <li><a href="/wiki/Embarrassingly_parallel" title="Embarrassingly parallel">Embarrassingly parallel</a></li> <li><a href="/wiki/Parallel_slowdown" title="Parallel slowdown">Parallel slowdown</a></li> <li><a href="/wiki/Race_condition" title="Race condition">Race condition</a></li> <li><a href="/wiki/Software_lockout" title="Software lockout">Software lockout</a></li> <li><a href="/wiki/Scalability" title="Scalability">Scalability</a></li> <li><a href="/wiki/Starvation_(computer_science)" title="Starvation (computer science)">Starvation</a></li></ul> </div></td></tr><tr><td class="navbox-abovebelow" colspan="2"><div> <ul><li><span class="noviewer" typeof="mw:File"><span title="Category"><img alt="" src="//upload.wikimedia.org/wikipedia/en/thumb/9/96/Symbol_category_class.svg/16px-Symbol_category_class.svg.png" decoding="async" width="16" height="16" class="mw-file-element" srcset="//upload.wikimedia.org/wikipedia/en/thumb/9/96/Symbol_category_class.svg/23px-Symbol_category_class.svg.png 1.5x, //upload.wikimedia.org/wikipedia/en/thumb/9/96/Symbol_category_class.svg/31px-Symbol_category_class.svg.png 2x" data-file-width="180" data-file-height="185" /></span></span> <a href="/wiki/Category:Parallel_computing" title="Category:Parallel computing">Category: Parallel computing</a></li></ul> </div></td></tr></tbody></table></div> <!-- NewPP limit report Parsed by mw‐web.codfw.main‐f69cdc8f6‐rkk8l Cached time: 20241122142229 Cache expiry: 2592000 Reduced expiry: false Complications: [vary‐revision‐sha1, show‐toc] CPU time usage: 0.390 seconds Real time usage: 1.707 seconds Preprocessor visited node count: 1642/1000000 Post‐expand include size: 54797/2097152 bytes Template argument size: 1667/2097152 bytes Highest expansion depth: 12/100 Expensive parser function count: 30/500 Unstrip recursion depth: 1/20 Unstrip post‐expand size: 104482/5000000 bytes Lua time usage: 0.205/10.000 seconds Lua memory usage: 5699996/52428800 bytes Number of Wikibase entities loaded: 0/400 --> <!-- Transclusion expansion time report (%,ms,calls,template) 100.00% 1628.156 1 -total 43.26% 704.275 20 Template:Code 8.59% 139.861 1 Template:Reflist 5.72% 93.205 6 Template:Cite_web 5.01% 81.644 2 Template:Navbox 4.86% 79.195 1 Template:Concurrent_computing 4.03% 65.679 1 Template:Short_description 2.51% 40.811 2 Template:Pagetype 2.06% 33.563 1 Template:Citation_needed 1.79% 29.067 1 Template:Fix --> <!-- Saved in parser cache with key enwiki:pcache:idhash:4736263-0!canonical and timestamp 20241122142229 and revision id 1247285491. Rendering was triggered because: page-view --> </div><!--esi <esi:include src="/esitest-fa8a495983347898/content" /> --><noscript><img src="https://login.wikimedia.org/wiki/Special:CentralAutoLogin/start?type=1x1" alt="" width="1" height="1" style="border: none; position: absolute;"></noscript> <div class="printfooter" data-nosnippet="">Retrieved from "<a dir="ltr" href="https://en.wikipedia.org/w/index.php?title=Barrier_(computer_science)&oldid=1247285491">https://en.wikipedia.org/w/index.php?title=Barrier_(computer_science)&oldid=1247285491</a>"</div></div> <div id="catlinks" class="catlinks" data-mw="interface"><div id="mw-normal-catlinks" class="mw-normal-catlinks"><a href="/wiki/Help:Category" title="Help:Category">Categories</a>: <ul><li><a href="/wiki/Category:Synchronization" title="Category:Synchronization">Synchronization</a></li><li><a href="/wiki/Category:Concurrency_control" title="Category:Concurrency control">Concurrency control</a></li><li><a href="/wiki/Category:Concurrency_(computer_science)" title="Category:Concurrency (computer science)">Concurrency (computer science)</a></li><li><a href="/wiki/Category:Parallel_computing" title="Category:Parallel computing">Parallel computing</a></li></ul></div><div id="mw-hidden-catlinks" class="mw-hidden-catlinks mw-hidden-cats-hidden">Hidden categories: <ul><li><a href="/wiki/Category:Articles_with_short_description" title="Category:Articles with short description">Articles with short description</a></li><li><a href="/wiki/Category:Short_description_is_different_from_Wikidata" title="Category:Short description is different from Wikidata">Short description is different from Wikidata</a></li><li><a href="/wiki/Category:All_articles_with_unsourced_statements" title="Category:All articles with unsourced statements">All articles with unsourced statements</a></li><li><a href="/wiki/Category:Articles_with_unsourced_statements_from_May_2024" title="Category:Articles with unsourced statements from May 2024">Articles with unsourced statements from May 2024</a></li></ul></div></div> </div> </main> </div> <div class="mw-footer-container"> <footer id="footer" class="mw-footer" > <ul id="footer-info"> <li id="footer-info-lastmod"> This page was last edited on 23 September 2024, at 17:03<span class="anonymous-show"> (UTC)</span>.</li> <li id="footer-info-copyright">Text is available under the <a href="/wiki/Wikipedia:Text_of_the_Creative_Commons_Attribution-ShareAlike_4.0_International_License" title="Wikipedia:Text of the Creative Commons Attribution-ShareAlike 4.0 International License">Creative Commons Attribution-ShareAlike 4.0 License</a>; additional terms may apply. By using this site, you agree to the <a href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Terms_of_Use" class="extiw" title="foundation:Special:MyLanguage/Policy:Terms of Use">Terms of Use</a> and <a href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Privacy_policy" class="extiw" title="foundation:Special:MyLanguage/Policy:Privacy policy">Privacy Policy</a>. Wikipedia® is a registered trademark of the <a rel="nofollow" class="external text" href="https://wikimediafoundation.org/">Wikimedia Foundation, Inc.</a>, a non-profit organization.</li> </ul> <ul id="footer-places"> <li id="footer-places-privacy"><a href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Privacy_policy">Privacy policy</a></li> <li id="footer-places-about"><a href="/wiki/Wikipedia:About">About Wikipedia</a></li> <li id="footer-places-disclaimers"><a href="/wiki/Wikipedia:General_disclaimer">Disclaimers</a></li> <li id="footer-places-contact"><a href="//en.wikipedia.org/wiki/Wikipedia:Contact_us">Contact Wikipedia</a></li> <li id="footer-places-wm-codeofconduct"><a href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Universal_Code_of_Conduct">Code of Conduct</a></li> <li id="footer-places-developers"><a href="https://developer.wikimedia.org">Developers</a></li> <li id="footer-places-statslink"><a href="https://stats.wikimedia.org/#/en.wikipedia.org">Statistics</a></li> <li id="footer-places-cookiestatement"><a href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Cookie_statement">Cookie statement</a></li> <li id="footer-places-mobileview"><a href="//en.m.wikipedia.org/w/index.php?title=Barrier_(computer_science)&mobileaction=toggle_view_mobile" class="noprint stopMobileRedirectToggle">Mobile view</a></li> </ul> <ul id="footer-icons" class="noprint"> <li id="footer-copyrightico"><a href="https://wikimediafoundation.org/" class="cdx-button cdx-button--fake-button cdx-button--size-large cdx-button--fake-button--enabled"><img src="/static/images/footer/wikimedia-button.svg" width="84" height="29" alt="Wikimedia Foundation" loading="lazy"></a></li> <li id="footer-poweredbyico"><a href="https://www.mediawiki.org/" class="cdx-button cdx-button--fake-button cdx-button--size-large cdx-button--fake-button--enabled"><img src="/w/resources/assets/poweredby_mediawiki.svg" alt="Powered by MediaWiki" width="88" height="31" loading="lazy"></a></li> </ul> </footer> </div> </div> </div> <div class="vector-settings" id="p-dock-bottom"> <ul></ul> </div><script>(RLQ=window.RLQ||[]).push(function(){mw.config.set({"wgHostname":"mw-web.codfw.main-f69cdc8f6-w98px","wgBackendResponseTime":151,"wgPageParseReport":{"limitreport":{"cputime":"0.390","walltime":"1.707","ppvisitednodes":{"value":1642,"limit":1000000},"postexpandincludesize":{"value":54797,"limit":2097152},"templateargumentsize":{"value":1667,"limit":2097152},"expansiondepth":{"value":12,"limit":100},"expensivefunctioncount":{"value":30,"limit":500},"unstrip-depth":{"value":1,"limit":20},"unstrip-size":{"value":104482,"limit":5000000},"entityaccesscount":{"value":0,"limit":400},"timingprofile":["100.00% 1628.156 1 -total"," 43.26% 704.275 20 Template:Code"," 8.59% 139.861 1 Template:Reflist"," 5.72% 93.205 6 Template:Cite_web"," 5.01% 81.644 2 Template:Navbox"," 4.86% 79.195 1 Template:Concurrent_computing"," 4.03% 65.679 1 Template:Short_description"," 2.51% 40.811 2 Template:Pagetype"," 2.06% 33.563 1 Template:Citation_needed"," 1.79% 29.067 1 Template:Fix"]},"scribunto":{"limitreport-timeusage":{"value":"0.205","limit":"10.000"},"limitreport-memusage":{"value":5699996,"limit":52428800}},"cachereport":{"origin":"mw-web.codfw.main-f69cdc8f6-rkk8l","timestamp":"20241122142229","ttl":2592000,"transientcontent":false}}});});</script> <script type="application/ld+json">{"@context":"https:\/\/schema.org","@type":"Article","name":"Barrier (computer science)","url":"https:\/\/en.wikipedia.org\/wiki\/Barrier_(computer_science)","sameAs":"http:\/\/www.wikidata.org\/entity\/Q2885682","mainEntity":"http:\/\/www.wikidata.org\/entity\/Q2885682","author":{"@type":"Organization","name":"Contributors to Wikimedia projects"},"publisher":{"@type":"Organization","name":"Wikimedia Foundation, Inc.","logo":{"@type":"ImageObject","url":"https:\/\/www.wikimedia.org\/static\/images\/wmf-hor-googpub.png"}},"datePublished":"2006-04-13T17:42:56Z","dateModified":"2024-09-23T17:03:38Z","headline":"synchronization mechanism that enforces an ordering on operations before and after the barrier"}</script> </body> </html>