{"id":6085,"date":"2021-02-10T08:31:41","date_gmt":"2021-02-10T08:31:41","guid":{"rendered":"https:\/\/www.modernescpp.com\/index.php\/resolving-c-c-concurrency-bugs-more-efficiently-with-time-travel-debugging\/"},"modified":"2021-02-10T08:31:41","modified_gmt":"2021-02-10T08:31:41","slug":"resolving-c-c-concurrency-bugs-more-efficiently-with-time-travel-debugging","status":"publish","type":"post","link":"https:\/\/www.modernescpp.com\/index.php\/resolving-c-c-concurrency-bugs-more-efficiently-with-time-travel-debugging\/","title":{"rendered":"Resolving C\/C++ Concurrency Bugs More Efficiently with Time Travel Debugging"},"content":{"rendered":"<p><!--[if gte mso 9]><xml>\n <o:DocumentProperties>\n  <o:Author>seminar<\/o:Author>\n  <o:LastAuthor>Rainer Grimm<\/o:LastAuthor>\n  <o:Revision>2<\/o:Revision>\n  <o:TotalTime>262<\/o:TotalTime>\n  <o:Created>2021-02-10T08:09:00Z<\/o:Created>\n  <o:LastSaved>2021-02-10T08:09:00Z<\/o:LastSaved>\n  <o:Pages>4<\/o:Pages>\n  <o:Words>1185<\/o:Words>\n  <o:Characters>6759<\/o:Characters>\n  <o:Lines>56<\/o:Lines>\n  <o:Paragraphs>15<\/o:Paragraphs>\n  <o:CharactersWithSpaces>7929<\/o:CharactersWithSpaces>\n  <o:Version>16.00<\/o:Version>\n <\/o:DocumentProperties>\n <o:OfficeDocumentSettings>\n  <o:RelyOnVML\/>\n  <o:AllowPNG\/>\n <\/o:OfficeDocumentSettings>\n<\/xml><![endif]--><!--[if gte mso 9]><xml>\n <w:WordDocument>\n  <w:SpellingState>Clean<\/w:SpellingState>\n  <w:GrammarState>Clean<\/w:GrammarState>\n  <w:TrackMoves>false<\/w:TrackMoves>\n  <w:TrackFormatting\/>\n  <w:PunctuationKerning\/>\n  <w:ValidateAgainstSchemas\/>\n  <w:SaveIfXMLInvalid>false<\/w:SaveIfXMLInvalid>\n  <w:IgnoreMixedContent>false<\/w:IgnoreMixedContent>\n  <w:AlwaysShowPlaceholderText>false<\/w:AlwaysShowPlaceholderText>\n  <w:DoNotPromoteQF\/>\n  <w:LidThemeOther>EN-GB<\/w:LidThemeOther>\n  <w:LidThemeAsian>ZH-CN<\/w:LidThemeAsian>\n  <w:LidThemeComplexScript>X-NONE<\/w:LidThemeComplexScript>\n  <w:Compatibility>\n   <w:BreakWrappedTables\/>\n   <w:SnapToGridInCell\/>\n   <w:WrapTextWithPunct\/>\n   <w:UseAsianBreakRules\/>\n   <w:DontGrowAutofit\/>\n   <w:SplitPgBreakAndParaMark\/>\n   <w:EnableOpenTypeKerning\/>\n   <w:DontFlipMirrorIndents\/>\n   <w:OverrideTableStyleHps\/>\n  <\/w:Compatibility>\n  <w:DoNotOptimizeForBrowser\/>\n  <m:mathPr>\n   <m:mathFont m:val=\"Cambria Math\"\/>\n   <m:brkBin m:val=\"before\"\/>\n   <m:brkBinSub m:val=\"&#45;-\"\/>\n   <m:smallFrac m:val=\"off\"\/>\n   <m:dispDef\/>\n   <m:lMargin m:val=\"0\"\/>\n   <m:rMargin m:val=\"0\"\/>\n   <m:defJc m:val=\"centerGroup\"\/>\n   <m:wrapIndent m:val=\"1440\"\/>\n   <m:intLim m:val=\"subSup\"\/>\n   <m:naryLim m:val=\"undOvr\"\/>\n  <\/m:mathPr><\/w:WordDocument>\n<\/xml><![endif]--><!--[if gte mso 9]><xml>\n <w:LatentStyles DefLockedState=\"false\" DefUnhideWhenUsed=\"false\"\n  DefSemiHidden=\"false\" DefQFormat=\"false\" DefPriority=\"99\"\n  LatentStyleCount=\"376\">\n  <w:LsdException Locked=\"false\" Priority=\"0\" QFormat=\"true\" Name=\"Normal\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"9\" QFormat=\"true\" Name=\"heading 1\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"9\" SemiHidden=\"true\"\n   UnhideWhenUsed=\"true\" QFormat=\"true\" Name=\"heading 2\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"9\" SemiHidden=\"true\"\n   UnhideWhenUsed=\"true\" QFormat=\"true\" Name=\"heading 3\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"9\" SemiHidden=\"true\"\n   UnhideWhenUsed=\"true\" QFormat=\"true\" Name=\"heading 4\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"9\" SemiHidden=\"true\"\n   UnhideWhenUsed=\"true\" QFormat=\"true\" Name=\"heading 5\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"9\" SemiHidden=\"true\"\n   UnhideWhenUsed=\"true\" QFormat=\"true\" Name=\"heading 6\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"9\" SemiHidden=\"true\"\n   UnhideWhenUsed=\"true\" QFormat=\"true\" Name=\"heading 7\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"9\" SemiHidden=\"true\"\n   UnhideWhenUsed=\"true\" QFormat=\"true\" Name=\"heading 8\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"9\" SemiHidden=\"true\"\n   UnhideWhenUsed=\"true\" QFormat=\"true\" Name=\"heading 9\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"index 1\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"index 2\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"index 3\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"index 4\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"index 5\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"index 6\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"index 7\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"index 8\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"index 9\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"39\" SemiHidden=\"true\"\n   UnhideWhenUsed=\"true\" Name=\"toc 1\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"39\" SemiHidden=\"true\"\n   UnhideWhenUsed=\"true\" Name=\"toc 2\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"39\" SemiHidden=\"true\"\n   UnhideWhenUsed=\"true\" Name=\"toc 3\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"39\" SemiHidden=\"true\"\n   UnhideWhenUsed=\"true\" Name=\"toc 4\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"39\" SemiHidden=\"true\"\n   UnhideWhenUsed=\"true\" Name=\"toc 5\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"39\" SemiHidden=\"true\"\n   UnhideWhenUsed=\"true\" Name=\"toc 6\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"39\" SemiHidden=\"true\"\n   UnhideWhenUsed=\"true\" Name=\"toc 7\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"39\" SemiHidden=\"true\"\n   UnhideWhenUsed=\"true\" Name=\"toc 8\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"39\" SemiHidden=\"true\"\n   UnhideWhenUsed=\"true\" Name=\"toc 9\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Normal Indent\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"footnote text\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"annotation text\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"header\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"footer\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"index heading\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"35\" SemiHidden=\"true\"\n   UnhideWhenUsed=\"true\" QFormat=\"true\" Name=\"caption\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"table of figures\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"envelope address\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"envelope return\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"footnote reference\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"annotation reference\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"line number\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"page number\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"endnote reference\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"endnote text\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"table of authorities\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"macro\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"toa heading\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"List\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"List Bullet\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"List Number\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"List 2\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"List 3\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"List 4\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"List 5\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"List Bullet 2\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"List Bullet 3\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"List Bullet 4\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"List Bullet 5\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"List Number 2\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"List Number 3\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"List Number 4\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"List Number 5\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"10\" QFormat=\"true\" Name=\"Title\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Closing\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Signature\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"1\" SemiHidden=\"true\"\n   UnhideWhenUsed=\"true\" Name=\"Default Paragraph Font\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Body Text\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Body Text Indent\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"List Continue\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"List Continue 2\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"List Continue 3\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"List Continue 4\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"List Continue 5\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Message Header\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"11\" QFormat=\"true\" Name=\"Subtitle\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Salutation\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Date\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Body Text First Indent\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Body Text First Indent 2\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Note Heading\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Body Text 2\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Body Text 3\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Body Text Indent 2\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Body Text Indent 3\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Block Text\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Hyperlink\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"FollowedHyperlink\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"22\" QFormat=\"true\" Name=\"Strong\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"20\" QFormat=\"true\" Name=\"Emphasis\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Document Map\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Plain Text\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"E-mail Signature\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"HTML Top of Form\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"HTML Bottom of Form\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Normal (Web)\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"HTML Acronym\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"HTML Address\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"HTML Cite\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"HTML Code\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"HTML Definition\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"HTML Keyboard\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"HTML Preformatted\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"HTML Sample\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"HTML Typewriter\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"HTML Variable\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Normal Table\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"annotation subject\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"No List\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Outline List 1\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Outline List 2\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Outline List 3\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Table Simple 1\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Table Simple 2\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Table Simple 3\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Table Classic 1\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Table Classic 2\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Table Classic 3\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Table Classic 4\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Table Colorful 1\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Table Colorful 2\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Table Colorful 3\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Table Columns 1\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Table Columns 2\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Table Columns 3\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Table Columns 4\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Table Columns 5\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Table Grid 1\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Table Grid 2\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Table Grid 3\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Table Grid 4\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Table Grid 5\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Table Grid 6\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Table Grid 7\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Table Grid 8\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Table List 1\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Table List 2\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Table List 3\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Table List 4\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Table List 5\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Table List 6\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Table List 7\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Table List 8\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Table 3D effects 1\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Table 3D effects 2\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Table 3D effects 3\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Table Contemporary\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Table Elegant\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Table Professional\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Table Subtle 1\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Table Subtle 2\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Table Web 1\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Table Web 2\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Table Web 3\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Balloon Text\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"39\" Name=\"Table Grid\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Table Theme\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" Name=\"Placeholder Text\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"1\" QFormat=\"true\" Name=\"No Spacing\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"60\" Name=\"Light Shading\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"61\" Name=\"Light List\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"62\" Name=\"Light Grid\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"63\" Name=\"Medium Shading 1\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"64\" Name=\"Medium Shading 2\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"65\" Name=\"Medium List 1\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"66\" Name=\"Medium List 2\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"67\" Name=\"Medium Grid 1\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"68\" Name=\"Medium Grid 2\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"69\" Name=\"Medium Grid 3\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"70\" Name=\"Dark List\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"71\" Name=\"Colorful Shading\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"72\" Name=\"Colorful List\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"73\" Name=\"Colorful Grid\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"60\" Name=\"Light Shading Accent 1\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"61\" Name=\"Light List Accent 1\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"62\" Name=\"Light Grid Accent 1\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"63\" Name=\"Medium Shading 1 Accent 1\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"64\" Name=\"Medium Shading 2 Accent 1\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"65\" Name=\"Medium List 1 Accent 1\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" Name=\"Revision\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"34\" QFormat=\"true\"\n   Name=\"List Paragraph\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"29\" QFormat=\"true\" Name=\"Quote\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"30\" QFormat=\"true\"\n   Name=\"Intense Quote\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"66\" Name=\"Medium List 2 Accent 1\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"67\" Name=\"Medium Grid 1 Accent 1\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"68\" Name=\"Medium Grid 2 Accent 1\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"69\" Name=\"Medium Grid 3 Accent 1\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"70\" Name=\"Dark List Accent 1\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"71\" Name=\"Colorful Shading Accent 1\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"72\" Name=\"Colorful List Accent 1\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"73\" Name=\"Colorful Grid Accent 1\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"60\" Name=\"Light Shading Accent 2\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"61\" Name=\"Light List Accent 2\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"62\" Name=\"Light Grid Accent 2\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"63\" Name=\"Medium Shading 1 Accent 2\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"64\" Name=\"Medium Shading 2 Accent 2\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"65\" Name=\"Medium List 1 Accent 2\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"66\" Name=\"Medium List 2 Accent 2\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"67\" Name=\"Medium Grid 1 Accent 2\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"68\" Name=\"Medium Grid 2 Accent 2\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"69\" Name=\"Medium Grid 3 Accent 2\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"70\" Name=\"Dark List Accent 2\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"71\" Name=\"Colorful Shading Accent 2\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"72\" Name=\"Colorful List Accent 2\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"73\" Name=\"Colorful Grid Accent 2\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"60\" Name=\"Light Shading Accent 3\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"61\" Name=\"Light List Accent 3\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"62\" Name=\"Light Grid Accent 3\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"63\" Name=\"Medium Shading 1 Accent 3\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"64\" Name=\"Medium Shading 2 Accent 3\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"65\" Name=\"Medium List 1 Accent 3\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"66\" Name=\"Medium List 2 Accent 3\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"67\" Name=\"Medium Grid 1 Accent 3\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"68\" Name=\"Medium Grid 2 Accent 3\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"69\" Name=\"Medium Grid 3 Accent 3\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"70\" Name=\"Dark List Accent 3\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"71\" Name=\"Colorful Shading Accent 3\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"72\" Name=\"Colorful List Accent 3\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"73\" Name=\"Colorful Grid Accent 3\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"60\" Name=\"Light Shading Accent 4\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"61\" Name=\"Light List Accent 4\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"62\" Name=\"Light Grid Accent 4\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"63\" Name=\"Medium Shading 1 Accent 4\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"64\" Name=\"Medium Shading 2 Accent 4\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"65\" Name=\"Medium List 1 Accent 4\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"66\" Name=\"Medium List 2 Accent 4\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"67\" Name=\"Medium Grid 1 Accent 4\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"68\" Name=\"Medium Grid 2 Accent 4\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"69\" Name=\"Medium Grid 3 Accent 4\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"70\" Name=\"Dark List Accent 4\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"71\" Name=\"Colorful Shading Accent 4\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"72\" Name=\"Colorful List Accent 4\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"73\" Name=\"Colorful Grid Accent 4\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"60\" Name=\"Light Shading Accent 5\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"61\" Name=\"Light List Accent 5\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"62\" Name=\"Light Grid Accent 5\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"63\" Name=\"Medium Shading 1 Accent 5\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"64\" Name=\"Medium Shading 2 Accent 5\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"65\" Name=\"Medium List 1 Accent 5\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"66\" Name=\"Medium List 2 Accent 5\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"67\" Name=\"Medium Grid 1 Accent 5\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"68\" Name=\"Medium Grid 2 Accent 5\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"69\" Name=\"Medium Grid 3 Accent 5\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"70\" Name=\"Dark List Accent 5\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"71\" Name=\"Colorful Shading Accent 5\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"72\" Name=\"Colorful List Accent 5\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"73\" Name=\"Colorful Grid Accent 5\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"60\" Name=\"Light Shading Accent 6\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"61\" Name=\"Light List Accent 6\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"62\" Name=\"Light Grid Accent 6\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"63\" Name=\"Medium Shading 1 Accent 6\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"64\" Name=\"Medium Shading 2 Accent 6\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"65\" Name=\"Medium List 1 Accent 6\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"66\" Name=\"Medium List 2 Accent 6\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"67\" Name=\"Medium Grid 1 Accent 6\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"68\" Name=\"Medium Grid 2 Accent 6\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"69\" Name=\"Medium Grid 3 Accent 6\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"70\" Name=\"Dark List Accent 6\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"71\" Name=\"Colorful Shading Accent 6\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"72\" Name=\"Colorful List Accent 6\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"73\" Name=\"Colorful Grid Accent 6\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"19\" QFormat=\"true\"\n   Name=\"Subtle Emphasis\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"21\" QFormat=\"true\"\n   Name=\"Intense Emphasis\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"31\" QFormat=\"true\"\n   Name=\"Subtle Reference\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"32\" QFormat=\"true\"\n   Name=\"Intense Reference\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"33\" QFormat=\"true\" Name=\"Book Title\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"37\" SemiHidden=\"true\"\n   UnhideWhenUsed=\"true\" Name=\"Bibliography\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"39\" SemiHidden=\"true\"\n   UnhideWhenUsed=\"true\" QFormat=\"true\" Name=\"TOC Heading\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"41\" Name=\"Plain Table 1\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"42\" Name=\"Plain Table 2\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"43\" Name=\"Plain Table 3\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"44\" Name=\"Plain Table 4\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"45\" Name=\"Plain Table 5\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"40\" Name=\"Grid Table Light\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"46\" Name=\"Grid Table 1 Light\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"47\" Name=\"Grid Table 2\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"48\" Name=\"Grid Table 3\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"49\" Name=\"Grid Table 4\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"50\" Name=\"Grid Table 5 Dark\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"51\" Name=\"Grid Table 6 Colorful\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"52\" Name=\"Grid Table 7 Colorful\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"46\"\n   Name=\"Grid Table 1 Light Accent 1\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"47\" Name=\"Grid Table 2 Accent 1\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"48\" Name=\"Grid Table 3 Accent 1\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"49\" Name=\"Grid Table 4 Accent 1\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"50\" Name=\"Grid Table 5 Dark Accent 1\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"51\"\n   Name=\"Grid Table 6 Colorful Accent 1\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"52\"\n   Name=\"Grid Table 7 Colorful Accent 1\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"46\"\n   Name=\"Grid Table 1 Light Accent 2\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"47\" Name=\"Grid Table 2 Accent 2\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"48\" Name=\"Grid Table 3 Accent 2\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"49\" Name=\"Grid Table 4 Accent 2\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"50\" Name=\"Grid Table 5 Dark Accent 2\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"51\"\n   Name=\"Grid Table 6 Colorful Accent 2\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"52\"\n   Name=\"Grid Table 7 Colorful Accent 2\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"46\"\n   Name=\"Grid Table 1 Light Accent 3\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"47\" Name=\"Grid Table 2 Accent 3\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"48\" Name=\"Grid Table 3 Accent 3\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"49\" Name=\"Grid Table 4 Accent 3\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"50\" Name=\"Grid Table 5 Dark Accent 3\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"51\"\n   Name=\"Grid Table 6 Colorful Accent 3\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"52\"\n   Name=\"Grid Table 7 Colorful Accent 3\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"46\"\n   Name=\"Grid Table 1 Light Accent 4\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"47\" Name=\"Grid Table 2 Accent 4\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"48\" Name=\"Grid Table 3 Accent 4\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"49\" Name=\"Grid Table 4 Accent 4\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"50\" Name=\"Grid Table 5 Dark Accent 4\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"51\"\n   Name=\"Grid Table 6 Colorful Accent 4\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"52\"\n   Name=\"Grid Table 7 Colorful Accent 4\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"46\"\n   Name=\"Grid Table 1 Light Accent 5\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"47\" Name=\"Grid Table 2 Accent 5\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"48\" Name=\"Grid Table 3 Accent 5\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"49\" Name=\"Grid Table 4 Accent 5\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"50\" Name=\"Grid Table 5 Dark Accent 5\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"51\"\n   Name=\"Grid Table 6 Colorful Accent 5\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"52\"\n   Name=\"Grid Table 7 Colorful Accent 5\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"46\"\n   Name=\"Grid Table 1 Light Accent 6\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"47\" Name=\"Grid Table 2 Accent 6\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"48\" Name=\"Grid Table 3 Accent 6\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"49\" Name=\"Grid Table 4 Accent 6\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"50\" Name=\"Grid Table 5 Dark Accent 6\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"51\"\n   Name=\"Grid Table 6 Colorful Accent 6\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"52\"\n   Name=\"Grid Table 7 Colorful Accent 6\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"46\" Name=\"List Table 1 Light\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"47\" Name=\"List Table 2\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"48\" Name=\"List Table 3\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"49\" Name=\"List Table 4\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"50\" Name=\"List Table 5 Dark\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"51\" Name=\"List Table 6 Colorful\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"52\" Name=\"List Table 7 Colorful\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"46\"\n   Name=\"List Table 1 Light Accent 1\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"47\" Name=\"List Table 2 Accent 1\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"48\" Name=\"List Table 3 Accent 1\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"49\" Name=\"List Table 4 Accent 1\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"50\" Name=\"List Table 5 Dark Accent 1\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"51\"\n   Name=\"List Table 6 Colorful Accent 1\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"52\"\n   Name=\"List Table 7 Colorful Accent 1\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"46\"\n   Name=\"List Table 1 Light Accent 2\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"47\" Name=\"List Table 2 Accent 2\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"48\" Name=\"List Table 3 Accent 2\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"49\" Name=\"List Table 4 Accent 2\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"50\" Name=\"List Table 5 Dark Accent 2\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"51\"\n   Name=\"List Table 6 Colorful Accent 2\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"52\"\n   Name=\"List Table 7 Colorful Accent 2\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"46\"\n   Name=\"List Table 1 Light Accent 3\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"47\" Name=\"List Table 2 Accent 3\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"48\" Name=\"List Table 3 Accent 3\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"49\" Name=\"List Table 4 Accent 3\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"50\" Name=\"List Table 5 Dark Accent 3\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"51\"\n   Name=\"List Table 6 Colorful Accent 3\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"52\"\n   Name=\"List Table 7 Colorful Accent 3\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"46\"\n   Name=\"List Table 1 Light Accent 4\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"47\" Name=\"List Table 2 Accent 4\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"48\" Name=\"List Table 3 Accent 4\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"49\" Name=\"List Table 4 Accent 4\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"50\" Name=\"List Table 5 Dark Accent 4\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"51\"\n   Name=\"List Table 6 Colorful Accent 4\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"52\"\n   Name=\"List Table 7 Colorful Accent 4\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"46\"\n   Name=\"List Table 1 Light Accent 5\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"47\" Name=\"List Table 2 Accent 5\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"48\" Name=\"List Table 3 Accent 5\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"49\" Name=\"List Table 4 Accent 5\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"50\" Name=\"List Table 5 Dark Accent 5\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"51\"\n   Name=\"List Table 6 Colorful Accent 5\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"52\"\n   Name=\"List Table 7 Colorful Accent 5\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"46\"\n   Name=\"List Table 1 Light Accent 6\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"47\" Name=\"List Table 2 Accent 6\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"48\" Name=\"List Table 3 Accent 6\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"49\" Name=\"List Table 4 Accent 6\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"50\" Name=\"List Table 5 Dark Accent 6\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"51\"\n   Name=\"List Table 6 Colorful Accent 6\"\/>\n  <w:LsdException Locked=\"false\" Priority=\"52\"\n   Name=\"List Table 7 Colorful Accent 6\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Mention\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Smart Hyperlink\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Hashtag\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Unresolved Mention\"\/>\n  <w:LsdException Locked=\"false\" SemiHidden=\"true\" UnhideWhenUsed=\"true\"\n   Name=\"Smart Link\"\/>\n <\/w:LatentStyles>\n<\/xml><![endif]--><\/p>\n<p><span lang=\"EN-US\" style=\"color: black; mso-ansi-language: EN-US;\">I&#8217;m happy to announce a guest post about Time Travel Debugging with UDB. At the end of the post, I have a bonus.<\/span><b style=\"mso-bidi-font-weight: normal;\"><span lang=\"EN-US\" style=\"color: black; mso-ansi-language: EN-US;\"><br \/><\/span><\/b><\/p>\n<p><!--more--><br \/>\n<!--[if gte mso 10]>\n\n<![endif]--><!--[if gte mso 9]><xml>\n <o:shapedefaults v:ext=\"edit\" spidmax=\"2049\"\/>\n<\/xml><![endif]--><!--[if gte mso 9]><xml>\n <o:shapelayout v:ext=\"edit\">\n  <o:idmap v:ext=\"edit\" data=\"1\"\/>\n <\/o:shapelayout><\/xml><![endif]--><\/p>\n<div class=\"WordSection1\">\n<p>&nbsp;<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\" size-full wp-image-6084\" src=\"https:\/\/www.modernescpp.com\/wp-content\/uploads\/2021\/02\/Undo.png\" alt=\"Undo\" width=\"400\" height=\"129\" style=\"display: block; margin-left: auto; margin-right: auto;\" srcset=\"https:\/\/www.modernescpp.com\/wp-content\/uploads\/2021\/02\/Undo.png 764w, https:\/\/www.modernescpp.com\/wp-content\/uploads\/2021\/02\/Undo-300x97.png 300w\" sizes=\"auto, (max-width: 400px) 100vw, 400px\" \/><\/p>\n<p class=\"MsoNormal\"><span lang=\"EN-US\" style=\"color: black; mso-ansi-language: EN-US;\">C and C++ developers requiring high performance often employ various <\/span><a href=\"https:\/\/en.wikipedia.org\/wiki\/Concurrent_computing\"><span lang=\"EN-US\" style=\"color: black; mso-ansi-language: EN-US; text-decoration: none; text-underline: none;\">concurrent computing<\/span><\/a><span lang=\"EN-US\" style=\"color: black; mso-ansi-language: EN-US;\"> techniques in which several threads of execution operate simultaneously.<\/span><\/p>\n<p class=\"MsoNormal\"><span lang=\"EN-US\" style=\"color: black; mso-ansi-language: EN-US;\">Recent <span class=\"SpellE\"><b style=\"mso-bidi-font-weight: normal;\">Modernes<\/b><\/span><b style=\"mso-bidi-font-weight: normal;\"> C++<\/b> blog posts explain how to avoid concurrency bugs in multithreaded C++ systems by using <\/span><a href=\"https:\/\/www.modernescpp.com\/index.php\/latches-in-c-20\"><span lang=\"EN-US\" style=\"mso-ansi-language: EN-US;\">Latches<\/span><\/a><span lang=\"EN-US\" style=\"color: black; mso-ansi-language: EN-US;\">, <\/span><a href=\"https:\/\/www.modernescpp.com\/index.php\/semaphores-in-c-20\"><span lang=\"EN-US\" style=\"mso-ansi-language: EN-US;\">Semaphores<\/span><\/a><span lang=\"EN-US\" style=\"color: black; mso-ansi-language: EN-US;\">, and <\/span><a href=\"http:\/\/www.modernescpp.com\/index.php\/barriers-in-c-20\"><span lang=\"EN-US\" style=\"mso-ansi-language: EN-US;\">Barriers and Atomic Smart Pointers<\/span><\/a><span lang=\"EN-US\" style=\"color: black; mso-ansi-language: EN-US;\">.<\/span><\/p>\n<p class=\"MsoNormal\"><span lang=\"EN-US\" style=\"color: black; mso-ansi-language: EN-US;\">These practices are important because if one does not pay careful attention to thread locking and memory access, there&#8217;s a risk of introducing new failure modes (<span class=\"GramE\">e.g.<\/span> nondeterministic behaviour, race conditions, etc.), which can make the application very difficult to debug. <\/span><\/p>\n<p class=\"MsoNormal\"><span lang=\"EN-US\" style=\"color: black; mso-ansi-language: EN-US;\">In this article, we will take a closer look at concurrency bugs and explain how <b style=\"mso-bidi-font-weight: normal;\">Time Travel Debugging<\/b> (a.k.a. reverse debugging) can be used to resolve them more quickly.<\/span><\/p>\n<h2><span lang=\"EN-US\" style=\"color: black; mso-ansi-language: EN-US;\">What are concurrency bugs?<\/span><\/h2>\n<p class=\"MsoNormal\"><span lang=\"EN-US\" style=\"color: black; mso-ansi-language: EN-US;\">Concurrency bugs are nondeterministic defects that arise when the execution of a thread disrupts the behaviour of other threads running at the same time. <\/span><\/p>\n<p class=\"MsoNormal\"><span lang=\"EN-US\" style=\"color: black; mso-ansi-language: EN-US;\">Nondeterministic factors such as thread-switching or external data can affect the order or timing of thread execution, resulting in unpredictable application behaviour such as miscalculations, crashes, or hangs. Below are a few concurrency <span class=\"GramE\">defect<\/span> examples.<\/span><\/p>\n<h3>A<span lang=\"EN-US\" style=\"mso-ansi-language: EN-US;\">tomicity violation<\/span><\/h3>\n<p class=\"MsoNormal\"><span lang=\"EN-US\" style=\"color: black; mso-ansi-language: EN-US;\">If the execution of Thread 1 below is interrupted by Thread 2 immediately after passing the <\/span><b><span lang=\"EN-US\" style=\"font-family: 'Courier New'; mso-fareast-font-family: 'Courier New'; color: black; mso-ansi-language: EN-US;\">if<\/span><\/b><span lang=\"EN-US\" style=\"color: black; mso-ansi-language: EN-US;\"> <\/span><span lang=\"EN-US\" style=\"color: black; mso-ansi-language: EN-US;\">test, then Thread 1 will crash with a memory access violation.<\/span><\/p>\n<p style=\"margin: 0cm; background: #F3F3F3;\"><span style=\"font-size: 11.0pt; font-family: Consolas; color: black;\">Thread 1:<\/span><\/p>\n<p style=\"margin: 0cm; background: #F3F3F3;\"><span style=\"font-size: 11.0pt; font-family: Consolas; color: black;\">if (foo-&gt;bar)<\/span><\/p>\n<p style=\"margin: 0cm; background: #F3F3F3;\"><span style=\"font-size: 11.0pt; font-family: Consolas; color: black;\">{<\/span><\/p>\n<p style=\"margin: 0cm; background: #F3F3F3;\"><span style=\"font-size: 11.0pt; font-family: Consolas; color: black;\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"SpellE\">do_something<\/span>(foo-&gt;bar<span class=\"GramE\">);<\/span><\/span><\/p>\n<p style=\"margin: 0cm; background: #F3F3F3;\"><span style=\"font-size: 11.0pt; font-family: Consolas; color: black;\">}<\/span><\/p>\n<p style=\"margin: 0cm; background: #F3F3F3;\"><span style=\"color: black; mso-color-alt: windowtext;\"><\/span><\/p>\n<p style=\"margin: 0cm; background: #F3F3F3;\"><span style=\"font-size: 11.0pt; font-family: Consolas; color: black;\">Thread 2:<\/span><\/p>\n<p style=\"margin: 0cm; background: #F3F3F3;\"><span style=\"font-size: 11.0pt; font-family: Consolas; color: black;\">foo-&gt;bar = <span class=\"SpellE\"><span class=\"GramE\">nullptr<\/span><\/span><span class=\"GramE\">;<\/span><\/span><\/p>\n<h3><span lang=\"EN-US\" style=\"mso-ansi-language: EN-US;\">Deadlock<\/span><\/h3>\n<p class=\"MsoNormal\"><span lang=\"EN-US\" style=\"color: black; mso-ansi-language: EN-US;\">It is possible for Thread 1 to wait indefinitely for Thread 2 to unlock L2, while Thread 2 is waiting for Thread 1 to release L2.<\/span><\/p>\n<p style=\"margin: 0cm; background: #F3F3F3;\"><span style=\"font-size: 11.0pt; font-family: Consolas; color: black;\">Thread 1:<\/span><\/p>\n<p style=\"margin: 0cm; background: #F3F3F3;\"><span class=\"GramE\"><span style=\"font-size: 11.0pt; font-family: Consolas; color: black;\">std::<\/span><\/span><span class=\"SpellE\"><span style=\"font-size: 11.0pt; font-family: Consolas; color: black;\">lock_guard<\/span><\/span><span style=\"font-size: 11.0pt; font-family: Consolas; color: black;\">&lt;std::mutex&gt; lock(L1); std::<span class=\"SpellE\">lock_guard<\/span>&lt;std::mutex&gt; lock(L2);<\/span><\/p>\n<p style=\"margin: 0cm; background: #F3F3F3;\"><span style=\"color: black; mso-color-alt: windowtext;\"><\/span><\/p>\n<p style=\"margin: 0cm; background: #F3F3F3;\"><span style=\"font-size: 11.0pt; font-family: Consolas; color: black;\">Thread 2:<\/span><\/p>\n<p style=\"margin: 0cm; background: #F3F3F3;\"><span class=\"GramE\"><span style=\"font-size: 11.0pt; font-family: Consolas; color: black;\">std::<\/span><\/span><span class=\"SpellE\"><span style=\"font-size: 11.0pt; font-family: Consolas; color: black;\">lock_guard<\/span><\/span><span style=\"font-size: 11.0pt; font-family: Consolas; color: black;\">&lt;std::mutex&gt; lock(L2); std::<span class=\"SpellE\">lock_guard<\/span>&lt;std::mutex&gt; lock(L1);<\/span><\/p>\n<h3><span lang=\"EN-US\" style=\"mso-ansi-language: EN-US;\">Race condition<\/span><\/h3>\n<p class=\"MsoNormal\"><span lang=\"EN-US\" style=\"color: black; mso-ansi-language: EN-US;\">A race condition is a type of software defect that occurs when separate threads interact in an unforeseen way and disrupt the expected timing and order of operations. <\/span><\/p>\n<p class=\"MsoNormal\"><span lang=\"EN-US\" style=\"color: black; mso-ansi-language: EN-US;\">An example is where two threads try to change shared data at the same time, leading to unpredictable system behaviour. That is, multiple threads are in a race and different threads might win the race depending on non-deterministic events.<\/span><\/p>\n<h2><span lang=\"EN-US\" style=\"color: black; mso-ansi-language: EN-US;\">The hard way to find and fix concurrency <span class=\"GramE\">defects<\/span><\/span><\/h2>\n<p class=\"MsoNormal\"><span lang=\"EN-US\" style=\"color: black; mso-ansi-language: EN-US;\">If you have a defective multithreaded program, your starting point is likely to be the program entering a confused state or just crashing. From this starting point, you might find yourself following the steps below to find the cause of a concurrency defect and correct it:<\/span><\/p>\n<ol start=\"1\" type=\"1\" style=\"margin-top: 0cm;\">\n<li class=\"MsoNormal\" style=\"color: black; margin-bottom: 0cm; mso-list: l0 level1 lfo1;\"><span lang=\"EN-US\" style=\"mso-ansi-language: EN-US;\">Recreate the buggy <span class=\"GramE\">behaviour<\/span><\/span><\/li>\n<li class=\"MsoNormal\" style=\"color: black; margin-bottom: 0cm; mso-list: l0 level1 lfo1;\"><span lang=\"EN-US\" style=\"mso-ansi-language: EN-US;\">Hypothesize a <span class=\"GramE\">cause<\/span><\/span><\/li>\n<li class=\"MsoNormal\" style=\"color: black; margin-bottom: 0cm; mso-list: l0 level1 lfo1;\"><span lang=\"EN-US\" style=\"mso-ansi-language: EN-US;\">Log application state extensively to revise or validate the <span class=\"GramE\">hypothesis<\/span><\/span><\/li>\n<li class=\"MsoNormal\" style=\"color: black; margin-bottom: 0cm; mso-list: l0 level1 lfo1;\"><span lang=\"EN-US\" style=\"mso-ansi-language: EN-US;\">Identify the data structure being affected by the concurrency <span class=\"GramE\">defect<\/span><\/span><\/li>\n<li class=\"MsoNormal\" style=\"color: black; margin-bottom: 0cm; mso-list: l0 level1 lfo1;\"><span lang=\"EN-US\" style=\"mso-ansi-language: EN-US;\">Search code for the parts of the program that change the data structure (often painstaking!)<\/span><\/li>\n<li class=\"MsoNormal\" style=\"color: black; margin-bottom: 0cm; mso-list: l0 level1 lfo1;\"><span lang=\"EN-US\" style=\"mso-ansi-language: EN-US;\">Step through code and breakpoints to find the defect <span class=\"GramE\">happening<\/span> <\/span><\/li>\n<li class=\"MsoNormal\" style=\"color: black; mso-list: l0 level1 lfo1;\"><span lang=\"EN-US\" style=\"mso-ansi-language: EN-US;\">Correct the <span class=\"GramE\">code<\/span><\/span><\/li>\n<\/ol>\n<p class=\"MsoNormal\"><span lang=\"EN-US\" style=\"color: black; mso-ansi-language: EN-US;\">These steps can take days or weeks. <span class=\"GramE\">What#s<\/span> worse is that, since concurrency defects can be so hard to reproduce, causes often go undiscovered and uncorrected. <\/span><\/p>\n<h2><span lang=\"EN-US\" style=\"color: black; mso-ansi-language: EN-US;\">The easier way: Time Travel Debugging<\/span><\/h2>\n<p class=\"MsoNormal\"><span lang=\"EN-US\" style=\"color: black; mso-ansi-language: EN-US;\">Brian Kernighan famously wrote:<\/span><\/p>\n<p class=\"MsoNormal\"><i style=\"mso-bidi-font-style: normal;\"><span lang=\"EN-US\" style=\"color: black; mso-ansi-language: EN-US; mso-bidi-font-weight: bold;\">&#8220;Debugging involves backward reasoning, like solving murder mysteries. Something impossible occurred, and the only solid information is that it really did occur. <span class=\"GramE\">So<\/span> we must think backwards from the result to discover the reasons.&#8221;<\/span><\/i><\/p>\n<p class=\"MsoNormal\"><span lang=\"EN-US\" style=\"color: black; mso-ansi-language: EN-US;\">In other words, we really want the debugger to be able to tell us what happened in the past. You need to know what your program <span class=\"GramE\">actually did<\/span>, as opposed to what you expected it was going to do. <span class=\"GramE\">This is why<\/span> debugging typically involves reproducing the bug many times, slowly teasing out more and more information until you pin it down.<\/span><\/p>\n<p class=\"MsoNormal\"><span lang=\"EN-US\" style=\"color: black; mso-ansi-language: EN-US;\">Time Travel Debugging takes away all that guesswork and trial and error; the debugger can tell you directly what just happened.<\/span><\/p>\n<p class=\"MsoNormal\"><span lang=\"EN-US\" style=\"color: black; mso-ansi-language: EN-US;\">Time Travel Debugging is the ability of a debugger to stop after a failure in a program has been observed and to go back into the history of the execution to uncover the reason for the failure.<\/span><\/p>\n<p class=\"MsoNormal\"><span lang=\"EN-US\" style=\"color: black; mso-ansi-language: EN-US;\">For hard-to-reproduce concurrency bugs like race conditions, Time Travel Debugging allows you to start from the point of failure and step backwards to find the cause. This is a very different approach from the typical process of running and rerunning a program, again and again, adding logging logic as you go until you find the cause. <\/span><\/p>\n<p class=\"MsoNormal\"><span class=\"GramE\"><span lang=\"EN-US\" style=\"color: black; mso-ansi-language: EN-US;\">Let&#8217;s<\/span><\/span><span lang=\"EN-US\" style=\"color: black; mso-ansi-language: EN-US;\"> look at the impact Time Travel Debugging has on debugging a race condition.<\/span><\/p>\n<p class=\"MsoNormal\"><span lang=\"EN-US\" style=\"color: black; mso-ansi-language: EN-US;\">You start by loading and running a program <\/span><span style=\"color: black;\">(<\/span><span style=\"font-family: Consolas; color: black;\">race<\/span><span style=\"color: black;\">) <\/span><span lang=\"EN-US\" style=\"color: black; mso-ansi-language: EN-US;\">in a <\/span><a href=\"https:\/\/en.wikipedia.org\/wiki\/Time_travel_debugging#Time_traveling_debuggers\"><span lang=\"EN-US\" style=\"color: #1155cc; mso-ansi-language: EN-US;\">debugger that supports time travel<\/span><\/a><span lang=\"EN-US\" style=\"color: black; mso-ansi-language: EN-US;\"> (such as <\/span><a href=\"https:\/\/undo.io\/solutions\/products\/udb\/\"><span lang=\"EN-US\" style=\"color: #1155cc; mso-ansi-language: EN-US;\">UDB<\/span><\/a><span lang=\"EN-US\" style=\"color: black; mso-ansi-language: EN-US;\">). In our example below, you can see the program crashes:<\/span><\/p>\n<p style=\"background: #F3F3F3; margin: 6.0pt 0cm 0cm 0cm;\"><span class=\"GramE\"><span style=\"font-size: 11.0pt; font-family: Consolas; color: black; background: #F5F2F0;\">.\/<\/span><\/span><span class=\"SpellE\"><span style=\"font-size: 11.0pt; font-family: Consolas; color: black; background: #F5F2F0;\">udb<\/span><\/span><span style=\"font-size: 11.0pt; font-family: Consolas; color: black; background: #F5F2F0;\"> race<\/span><\/p>\n<p style=\"margin: 0cm; background: #F3F3F3;\"><span style=\"font-size: 11.0pt; font-family: Consolas; color: black; background: #F5F2F0;\">(<span class=\"SpellE\">udb<\/span>) <span class=\"GramE\">run<\/span><\/span><\/p>\n<p style=\"margin: 0cm; background: #F3F3F3;\"><span style=\"font-size: 11.0pt; font-family: Consolas; color: black; background: #F5F2F0;\">&#8230;<\/span><\/p>\n<p style=\"margin: 0cm; background: #F3F3F3;\"><span class=\"SpellE\"><span style=\"font-size: 11.0pt; font-family: Consolas; color: black; background: #F5F2F0;\">s_threadfn<\/span><\/span><span style=\"font-size: 11.0pt; font-family: Consolas; color: black; background: #F5F2F0;\">: it=110000<\/span><\/p>\n<p style=\"margin: 0cm; background: #F3F3F3;\"><span class=\"SpellE\"><span style=\"font-size: 11.0pt; font-family: Consolas; color: black; background: #F5F2F0;\">s_threadfn<\/span><\/span><span style=\"font-size: 11.0pt; font-family: Consolas; color: black; background: #F5F2F0;\">: it=70000<\/span><\/p>\n<p style=\"margin: 0cm; background: #F3F3F3;\"><span style=\"font-size: 10.0pt; font-family: Consolas; color: black; background: #F5F2F0;\">race: race.cpp:34: void <span class=\"SpellE\">s_<span class=\"GramE\">threadfn<\/span><\/span><span class=\"GramE\">(<\/span>): Assertion `<span class=\"SpellE\">s_value<\/span> == <span class=\"SpellE\">old_value<\/span> + a&#8217; failed.<\/span><\/p>\n<p style=\"margin: 0cm; background: #F3F3F3;\"><span style=\"color: black; mso-color-alt: windowtext;\"><\/span><\/p>\n<p style=\"margin: 0cm; background: #F3F3F3;\"><span style=\"font-size: 11.0pt; font-family: Consolas; color: black; background: #F5F2F0;\">[New Thread 3441.3452]<\/span><\/p>\n<p style=\"margin: 0cm; background: #F3F3F3;\"><span style=\"color: black; mso-color-alt: windowtext;\"><\/span><\/p>\n<p style=\"margin: 0cm; background: #F3F3F3;\"><span style=\"font-size: 11.0pt; font-family: Consolas; color: black; background: #F5F2F0;\">Program received signal SIGABRT, Aborted.<\/span><\/p>\n<p style=\"margin: 0cm; background: #F3F3F3;\"><span style=\"font-size: 11.0pt; font-family: Consolas; color: black; background: #F5F2F0;\">[Switching to Thread 3441.3452]<\/span><\/p>\n<p class=\"MsoNormal\"><span style=\"color: black;\"><\/span><\/p>\n<p class=\"MsoNormal\"><span lang=\"EN-US\" style=\"color: black; mso-ansi-language: EN-US;\">In our example, the error is all about the<\/span><\/p>\n<p class=\"MsoNormal\"><span style=\"font-family: Consolas; color: black; background: #F5F2F0;\">Assertion `<span class=\"SpellE\">s_value<\/span> == <span class=\"SpellE\">old_value<\/span> + a&#8217; failed<\/span><span lang=\"EN-US\" style=\"color: black; mso-ansi-language: EN-US;\"><\/span><\/p>\n<p class=\"MsoNormal\" style=\"background: white;\"><span lang=\"EN-US\" style=\"color: black; mso-ansi-language: EN-US;\">We want to know why one thread expects one value but gets another. We then use <\/span><span style=\"font-family: Consolas; color: black;\">reverse-finish <\/span><span lang=\"EN-US\" style=\"color: black; mso-ansi-language: EN-US;\">until we arrive at a line in our program:<\/span><\/p>\n<p style=\"margin: 0cm; background: #F3F3F3;\"><span style=\"font-size: 10.0pt; font-family: Consolas; color: black; background: #F5F2F0;\">(<span class=\"SpellE\">udb<\/span>) rf<\/span><\/p>\n<p style=\"margin: 0cm; background: #F3F3F3;\"><span style=\"font-size: 10.0pt; font-family: Consolas; color: black; background: #F5F2F0;\">79 &nbsp; &nbsp;<span class=\"apple-tab-span\"><span style=\"mso-tab-count: 1;\"> <\/span><\/span>&nbsp; &nbsp; &nbsp; <span class=\"GramE\">raise<\/span> (SIGABRT);<\/span><\/p>\n<p style=\"margin: 0cm; background: #F3F3F3;\"><span style=\"font-size: 10.0pt; font-family: Consolas; color: black; background: #F5F2F0;\">(<span class=\"SpellE\">udb<\/span>) rf<\/span><\/p>\n<p style=\"margin: 0cm; background: #F3F3F3;\"><span style=\"font-size: 10.0pt; font-family: Consolas; color: black; background: #F5F2F0;\">92 &nbsp; &nbsp;<span class=\"GramE\"><span class=\"apple-tab-span\"><span style=\"mso-tab-count: 1;\"> <\/span><\/span>&nbsp; abort<\/span> ();<\/span><\/p>\n<p style=\"margin: 0cm; background: #F3F3F3;\"><span style=\"font-size: 10.0pt; font-family: Consolas; color: black; background: #F5F2F0;\">(<span class=\"SpellE\">udb<\/span>) rf<\/span><\/p>\n<p style=\"margin: 0cm; background: #F3F3F3;\"><span style=\"font-size: 10.0pt; font-family: Consolas; color: black; background: #F5F2F0;\">101 &nbsp;&nbsp;<span class=\"GramE\"><span class=\"apple-tab-span\"><span style=\"mso-tab-count: 1;\"> <\/span><\/span>&nbsp; _<\/span>_<span class=\"SpellE\">assert_fail_base<\/span> (_(&#8220;%<span class=\"SpellE\">s%s%s<\/span>:%u: %<span class=\"SpellE\">s%sAssertion<\/span> `%s&#8217; failed.\\<span class=\"SpellE\">n%n<\/span>&#8220;),<\/span><\/p>\n<p style=\"margin: 0cm; background: #F3F3F3;\"><span style=\"font-size: 10.0pt; font-family: Consolas; color: black; background: #F5F2F0;\">(<span class=\"SpellE\">udb<\/span>) rf<\/span><\/p>\n<p style=\"margin: 0cm; background: #F3F3F3;\"><span style=\"font-size: 10.0pt; font-family: Consolas; color: black; background: #F5F2F0;\">34 &nbsp; &nbsp;<span class=\"apple-tab-span\"><span style=\"mso-tab-count: 1;\"> <\/span><\/span>&nbsp; &nbsp; &nbsp;&nbsp; <span class=\"GramE\">assert( <span class=\"SpellE\">s<\/span><\/span><span class=\"SpellE\">_value<\/span> == <span class=\"SpellE\">old_value<\/span> + a);<\/span><\/p>\n<p style=\"margin: 0cm; background: #F3F3F3;\"><span style=\"color: black; mso-color-alt: windowtext;\"><\/span><\/p>\n<p class=\"MsoNormal\"><span style=\"color: black;\"><\/span><\/p>\n<p class=\"MsoNormal\"><span lang=\"EN-US\" style=\"color: black; mso-ansi-language: EN-US;\">This brings us to where our program <span class=\"GramE\">aborted but<\/span> doesn&#8217;t tell us why. We know that when this line executes, the value of <\/span><span class=\"SpellE\"><span style=\"font-family: Consolas; color: black;\">s_value<\/span><\/span><span style=\"font-family: Consolas; color: black;\"> <\/span><span class=\"GramE\"><span lang=\"EN-US\" style=\"color: black; mso-ansi-language: EN-US;\">won&#8217;t<\/span><\/span><span lang=\"EN-US\" style=\"color: black; mso-ansi-language: EN-US;\"> be equal to <\/span><span class=\"SpellE\"><span style=\"font-family: Consolas; color: black;\">old_value<\/span><\/span><span style=\"font-family: Consolas; color: black;\"> + a<\/span><span lang=\"EN-US\" style=\"mso-fareast-font-family: 'Courier New'; color: black; mso-ansi-language: EN-US;\">,<\/span><span lang=\"EN-US\" style=\"color: black; mso-ansi-language: EN-US;\"> so we want to find out what other part of the program altered the value. At this point, we can start to see that <span class=\"GramE\">it&#8217;s<\/span> a race condition. The few lines leading up to the assert should see `<\/span><span style=\"font-family: Consolas; color: black;\">a<\/span><span lang=\"EN-US\" style=\"color: black; mso-ansi-language: EN-US;\">` be added to <\/span><span class=\"SpellE\"><span style=\"font-family: Consolas; color: black;\">s_value<\/span><\/span><span style=\"color: black;\"> <\/span><span lang=\"EN-US\" style=\"color: black; mso-ansi-language: EN-US;\">but by the time we hit the assert this <span class=\"GramE\">isn&#8217;t<\/span> the case, so another thread must have changed <\/span><span class=\"SpellE\"><span style=\"font-family: Consolas; color: black;\">s_value<\/span><\/span><span style=\"color: black;\"> <\/span><span lang=\"EN-US\" style=\"color: black; mso-ansi-language: EN-US;\">at the same time. So, it must be a race condition.<\/span><\/p>\n<p class=\"MsoNormal\"><span lang=\"EN-US\" style=\"color: black; mso-ansi-language: EN-US;\"><\/span><\/p>\n<p style=\"margin: 0cm; background: #F3F3F3;\"><span style=\"font-size: 11.0pt; font-family: Consolas; color: black; background: #F5F2F0;\">int a = <span class=\"SpellE\">s_random_<span class=\"GramE\">int<\/span><\/span><span class=\"GramE\">(<\/span>5);<\/span><\/p>\n<p style=\"margin: 0cm; background: #F3F3F3;\"><span class=\"SpellE\"><span style=\"font-size: 11.0pt; font-family: Consolas; color: black; background: #F5F2F0;\">s_value<\/span><\/span><span style=\"font-size: 11.0pt; font-family: Consolas; color: black; background: #F5F2F0;\"> += <span class=\"GramE\">a;<\/span><\/span><\/p>\n<p style=\"margin: 0cm; background: #F3F3F3;\"><span class=\"GramE\"><span style=\"font-size: 11.0pt; font-family: Consolas; color: black; background: #F5F2F0;\">assert( <span class=\"SpellE\">s<\/span><\/span><\/span><span class=\"SpellE\"><span style=\"font-size: 11.0pt; font-family: Consolas; color: black; background: #F5F2F0;\">_value<\/span><\/span><span style=\"font-size: 11.0pt; font-family: Consolas; color: black; background: #F5F2F0;\"> == <span class=\"SpellE\">old_value<\/span> + a);<\/span><\/p>\n<p class=\"MsoNormal\"><span style=\"color: black;\"><\/span><\/p>\n<p class=\"MsoNormal\"><span lang=\"EN-US\" style=\"color: black; mso-ansi-language: EN-US;\">We find this out by putting a watchpoint on <\/span><span class=\"SpellE\"><span style=\"font-family: Consolas; color: black;\">s_value<\/span><\/span><span lang=\"EN-US\" style=\"color: black; mso-ansi-language: EN-US;\">:<\/span><\/p>\n<p class=\"MsoNormal\"><span style=\"font-family: Consolas; color: black; background: #F5F2F0;\">(<span class=\"SpellE\">udb<\/span>) watch <span class=\"SpellE\">s_value<\/span><\/span><span lang=\"EN-US\" style=\"color: black; mso-ansi-language: EN-US;\"><\/span><\/p>\n<p class=\"MsoNormal\"><span lang=\"EN-US\" style=\"color: black; mso-ansi-language: EN-US;\">Now <span class=\"GramE\">we&#8217;re<\/span> paused at the point before the program aborted and we know that the cause of the problem is <\/span><span class=\"SpellE\"><span style=\"font-family: Consolas; color: black;\">s_value<\/span><\/span><span lang=\"EN-US\" style=\"color: black; mso-ansi-language: EN-US;\">. Remember the approach before &#8211; wading through the code to find references to <\/span><span class=\"SpellE\"><span style=\"font-family: Consolas; color: black;\">s_value<\/span><\/span><span lang=\"EN-US\" style=\"color: black; mso-ansi-language: EN-US;\">. Contrast this with what we do next, which is to run the program in reverse (automatically, not manually) watching for where <\/span><span class=\"SpellE\"><span style=\"font-family: Consolas; color: black;\">s_value<\/span><\/span><span style=\"color: black;\"> <\/span><span lang=\"EN-US\" style=\"color: black; mso-ansi-language: EN-US;\">is changed:<\/span><\/p>\n<p style=\"margin: 0cm; background: #F3F3F3;\"><span style=\"font-size: 11.0pt; font-family: Consolas; color: black; background: #F5F2F0;\">(<span class=\"SpellE\">udb<\/span>) reverse-<span class=\"GramE\">continue<\/span><\/span><\/p>\n<p style=\"margin: 0cm; background: #F3F3F3;\"><span style=\"font-size: 11.0pt; font-family: Consolas; color: black; background: #F5F2F0;\">Continuing.<\/span><\/p>\n<p style=\"margin: 0cm; background: #F3F3F3;\"><span style=\"font-size: 11.0pt; font-family: Consolas; color: black; background: #F5F2F0;\">[New Thread 8792.8820]<\/span><\/p>\n<p style=\"margin: 0cm; background: #F3F3F3;\"><span style=\"font-size: 11.0pt; font-family: Consolas; color: black; background: #F5F2F0;\">[Switching to Thread 8792.8820]<\/span><\/p>\n<p style=\"margin: 0cm; background: #F3F3F3;\"><span style=\"font-size: 11.0pt; font-family: Consolas; color: black; background: #F5F2F0;\">Hardware watchpoint 1: <span class=\"SpellE\">s_value<\/span><\/span><\/p>\n<p style=\"margin: 0cm; background: #F3F3F3;\"><span style=\"color: black; mso-color-alt: windowtext;\"><\/span><\/p>\n<p style=\"margin: 0cm; background: #F3F3F3;\"><span style=\"font-size: 11.0pt; font-family: Consolas; color: black; background: #F5F2F0;\">Old value = 236250<\/span><\/p>\n<p style=\"margin: 0cm; background: #F3F3F3;\"><span style=\"font-size: 11.0pt; font-family: Consolas; color: black; background: #F5F2F0;\">New value = 236249<\/span><\/p>\n<p style=\"margin: 0cm; background: #F3F3F3;\"><span style=\"font-size: 11.0pt; font-family: Consolas; color: black; background: #F5F2F0;\">0x0000000000400b86 in s_threadfn2 () at race.cpp:48<\/span><\/p>\n<p style=\"margin: 0cm; background: #F3F3F3;\"><span style=\"font-size: 11.0pt; font-family: Consolas; color: black; background: #F5F2F0;\">48&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"SpellE\">s_value<\/span> += <span class=\"GramE\">1;&nbsp; \/<\/span>* Unsafe. *\/<\/span><\/p>\n<div style=\"mso-element: para-border-div; border: none black 1.0pt; mso-border-alt: none black 0cm; padding: 0cm 0cm 0cm 0cm; background: white;\">\n<p class=\"MsoNormal\" style=\"background: white; border: none; mso-border-alt: none black 0cm; padding: 0cm; mso-padding-alt: 0cm 0cm 0cm 0cm; mso-border-between: 0cm none black; mso-padding-between: 0cm;\"><span style=\"color: black;\"><\/span><\/p>\n<\/div>\n<p class=\"MsoNormal\"><span lang=\"EN-US\" style=\"color: black; mso-ansi-language: EN-US;\">Now, the &#8220;Unsafe&#8221; comment <span class=\"GramE\">isn&#8217;t<\/span> going to be in a real system, but you get the idea. We have arrived at the line which is causing the race conditions. Two different threads both modifying <\/span><span class=\"SpellE\"><span style=\"font-family: Consolas; color: black;\">s_value<\/span><\/span><span lang=\"EN-US\" style=\"color: black; mso-ansi-language: EN-US;\">.<\/span><\/p>\n<p style=\"margin: 0cm; background: #F3F3F3;\"><span style=\"font-size: 10.0pt; font-family: Consolas; color: black; background: #F5F2F0;\">(<span class=\"SpellE\">udb<\/span>) list<\/span><\/p>\n<p style=\"margin: 0cm; background: #F3F3F3;\"><span style=\"font-size: 10.0pt; font-family: Consolas; color: black; background: #F5F2F0;\">43 &nbsp; &nbsp;<span class=\"apple-tab-span\"><span style=\"mso-tab-count: 1;\"> <\/span><\/span>&nbsp;<span class=\"GramE\"> &nbsp; {<\/span><\/span><\/p>\n<p style=\"margin: 0cm; background: #F3F3F3;\"><span style=\"font-size: 10.0pt; font-family: Consolas; color: black; background: #F5F2F0;\">44 &nbsp; &nbsp;<span class=\"apple-tab-span\"><span style=\"mso-tab-count: 1;\"> <\/span><\/span>&nbsp; &nbsp; &nbsp; &nbsp; if (it % (100) == 0)<\/span><\/p>\n<p style=\"margin: 0cm; background: #F3F3F3;\"><span style=\"font-size: 10.0pt; font-family: Consolas; color: black; background: #F5F2F0;\">45 &nbsp; &nbsp;<span class=\"apple-tab-span\"><span style=\"mso-tab-count: 1;\"> <\/span><\/span>&nbsp; &nbsp; &nbsp;<span class=\"GramE\"> &nbsp; {<\/span><\/span><\/p>\n<p style=\"margin: 0cm; background: #F3F3F3;\"><span style=\"font-size: 10.0pt; font-family: Consolas; color: black; background: #F5F2F0;\">46 &nbsp; &nbsp;<span class=\"apple-tab-span\"><span style=\"mso-tab-count: 1;\"> <\/span><\/span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"GramE\">std::<\/span><span class=\"SpellE\">cout<\/span> &lt;&lt; __FUNCTION__ &lt;&lt; &#8220;: it=&#8221; &lt;&lt; it &lt;&lt; &#8220;\\n&#8221;;<\/span><\/p>\n<p style=\"margin: 0cm; background: #F3F3F3;\"><span style=\"font-size: 10.0pt; font-family: Consolas; color: black; background: #F5F2F0;\">47 &nbsp; &nbsp;<span class=\"apple-tab-span\"><span style=\"mso-tab-count: 1;\"> <\/span><\/span>&nbsp; &nbsp; &nbsp; <span class=\"GramE\">&nbsp; }<\/span><\/span><\/p>\n<p style=\"margin: 0cm; background: #F3F3F3;\"><span style=\"font-size: 10.0pt; font-family: Consolas; color: black; background: #F5F2F0;\">48 &nbsp; &nbsp;<span class=\"apple-tab-span\"><span style=\"mso-tab-count: 1;\"> <\/span><\/span>&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"SpellE\">s_value<\/span> += <span class=\"GramE\">1; &nbsp; <\/span>\/* Unsafe. *\/<\/span><\/p>\n<p style=\"margin: 0cm; background: #F3F3F3;\"><span style=\"font-size: 10.0pt; font-family: Consolas; color: black; background: #F5F2F0;\">49 &nbsp; &nbsp;<span class=\"apple-tab-span\"><span style=\"mso-tab-count: 1;\"> <\/span><\/span>&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"SpellE\"><span class=\"GramE\">usleep<\/span><\/span><span class=\"GramE\">(<\/span>10*1000);<\/span><\/p>\n<p style=\"margin: 0cm; background: #F3F3F3;\"><span style=\"font-size: 10.0pt; font-family: Consolas; color: black; background: #F5F2F0;\">50 &nbsp; &nbsp;<span class=\"apple-tab-span\"><span style=\"mso-tab-count: 1;\"> <\/span><\/span>&nbsp; <span class=\"GramE\">&nbsp; }<\/span><\/span><\/p>\n<div style=\"mso-element: para-border-div; border: none black 1.0pt; mso-border-alt: none black 0cm; padding: 0cm 0cm 0cm 0cm; background: white;\">\n<p class=\"MsoNormal\" style=\"background: white; border: none; mso-border-alt: none black 0cm; padding: 0cm; mso-padding-alt: 0cm 0cm 0cm 0cm; mso-border-between: 0cm none black; mso-padding-between: 0cm;\"><span style=\"color: black;\"><\/span><\/p>\n<\/div>\n<p class=\"MsoNormal\"><span lang=\"EN-US\" style=\"color: black; mso-ansi-language: EN-US;\">And <span class=\"GramE\">that&#8217;s<\/span> it! <span class=\"GramE\">We&#8217;ve<\/span> found the offending line.<\/span><\/p>\n<h3 class=\"MsoNormal\"><span lang=\"EN-US\" style=\"color: black; mso-ansi-language: EN-US;\">Schroedinger effect<br \/><\/span><\/h3>\n<p>Of course, when we&#8217;re recording we will necessarily affect timings &#8211; ultimately it&#8217;s impossible to avoid the Schoedinger Effect. But in practice, it&#8217;s actually just as often that race conditions&nbsp;occur more frequently with recording than without as the other way round. Some recording systems have features that deliberately cause more thread switching to occur and make race conditions even more likely to happen while recording. (e.g. <a href=\"https:\/\/undo.io\/solutions\/products\/live-recorder\/\" target=\"_blank\" rel=\"noopener\">LiveRecorder<\/a>&#8216;s Thread Fuzzing and <a href=\"https:\/\/rr-project.org\/\" target=\"_blank\" rel=\"noopener\">rr<\/a>&#8216;s Chaos Mode).<\/p>\n<h2 style=\"margin-top: 10.0pt;\"><span lang=\"EN-US\" style=\"color: black; mso-ansi-language: EN-US;\">Summary<\/span><\/h2>\n<p class=\"MsoNormal\"><span lang=\"EN-US\" style=\"color: black; mso-ansi-language: EN-US;\">As application architectures become more complex, your debugging technology <span class=\"GramE\">has to<\/span> keep pace. You can <\/span><a href=\"https:\/\/undo.io\/udb-form\/\"><span lang=\"EN-US\" style=\"color: #1155cc; mso-ansi-language: EN-US;\">try Time Travel Debugging with UDB for free<\/span><\/a><span lang=\"EN-US\" style=\"color: black; mso-ansi-language: EN-US;\">. And there are <span class=\"GramE\">a number of<\/span> free and commercial debuggers that feature <\/span><a href=\"https:\/\/en.wikipedia.org\/wiki\/Time_travel_debugging#Time_traveling_debuggers\"><span lang=\"EN-US\" style=\"color: #1155cc; mso-ansi-language: EN-US;\">Time Travel Debugging listed here<\/span><\/a><span lang=\"EN-US\" style=\"color: black; mso-ansi-language: EN-US;\">. <\/span><\/p>\n<h2>Bonus<\/h2>\n<p>I&#8217;m happy to announce. When you mention my name <strong>Rainer Grimm<\/strong> while buying a UDB license, you get a 30% discount.<\/p>\n<p class=\"MsoNormal\"><span lang=\"EN-US\" style=\"color: black; mso-ansi-language: EN-US;\"><\/span><\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>I&#8217;m happy to announce a guest post about Time Travel Debugging with UDB. At the end of the post, I have a bonus.<\/p>\n","protected":false},"author":21,"featured_media":6084,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[360],"tags":[],"class_list":["post-6085","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-news"],"_links":{"self":[{"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/posts\/6085","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/users\/21"}],"replies":[{"embeddable":true,"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/comments?post=6085"}],"version-history":[{"count":0,"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/posts\/6085\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/media\/6084"}],"wp:attachment":[{"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/media?parent=6085"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/categories?post=6085"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/tags?post=6085"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}