{"id":1242,"date":"2024-12-18T04:07:10","date_gmt":"2024-12-18T04:07:10","guid":{"rendered":"https:\/\/infonaujiena.lt\/index.php\/2024\/12\/18\/ka-kiekvienas-sistemu-programuotojas-turetu-zinoti-apie-lygiagretuma\/"},"modified":"2024-12-18T04:07:10","modified_gmt":"2024-12-18T04:07:10","slug":"ka-kiekvienas-sistemu-programuotojas-turetu-zinoti-apie-lygiagretuma","status":"publish","type":"post","link":"https:\/\/infonaujiena.lt\/index.php\/2024\/12\/18\/ka-kiekvienas-sistemu-programuotojas-turetu-zinoti-apie-lygiagretuma\/","title":{"rendered":"K\u0105 kiekvienas sistem\u0173 programuotojas tur\u0117t\u0173 \u017einoti apie lygiagretum\u0105"},"content":{"rendered":"<p> <br \/>\n<\/p>\n<div id=\"\">\n<p>Lygiagretumas yra pagrindinis \u0161iuolaikinio skai\u010diavimo aspektas, leid\u017eiantis efektyviai panaudoti i\u0161teklius ir pagerinti na\u0161um\u0105. Ta\u010diau tai sukelia sud\u0117tingumo, d\u0117l kurio gali kilti subtili\u0173 ir sunkiai derinam\u0173 problem\u0173. \u0160iame straipsnyje ap\u017evelgiamos pagrindin\u0117s s\u0105vokos ir \u012frankiai, kuriuos sistem\u0173 programuotojai turi suprasti, kad gal\u0117t\u0173 veiksmingai valdyti lygiagretum\u0105.<\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_82_2 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Turinys:<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/infonaujiena.lt\/index.php\/2024\/12\/18\/ka-kiekvienas-sistemu-programuotojas-turetu-zinoti-apie-lygiagretuma\/#Fonas\" >Fonas<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/infonaujiena.lt\/index.php\/2024\/12\/18\/ka-kiekvienas-sistemu-programuotojas-turetu-zinoti-apie-lygiagretuma\/#Teises_ir_tvarkos_igyvendinimas\" >Teis\u0117s ir tvarkos \u012fgyvendinimas<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/infonaujiena.lt\/index.php\/2024\/12\/18\/ka-kiekvienas-sistemu-programuotojas-turetu-zinoti-apie-lygiagretuma\/#Atomiskumas\" >Atomi\u0161kumas<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/infonaujiena.lt\/index.php\/2024\/12\/18\/ka-kiekvienas-sistemu-programuotojas-turetu-zinoti-apie-lygiagretuma\/#Skaitymo-keitimo-rasymo_operacijos\" >Skaitymo-keitimo-ra\u0161ymo operacijos<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/infonaujiena.lt\/index.php\/2024\/12\/18\/ka-kiekvienas-sistemu-programuotojas-turetu-zinoti-apie-lygiagretuma\/#Atminties_uzsakymai\" >Atminties u\u017esakymai<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/infonaujiena.lt\/index.php\/2024\/12\/18\/ka-kiekvienas-sistemu-programuotojas-turetu-zinoti-apie-lygiagretuma\/#Isigyti_ir_isleisti\" >\u012esigyti ir i\u0161leisti<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/infonaujiena.lt\/index.php\/2024\/12\/18\/ka-kiekvienas-sistemu-programuotojas-turetu-zinoti-apie-lygiagretuma\/#Atpalaiduotos_operacijos\" >Atpalaiduotos operacijos<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/infonaujiena.lt\/index.php\/2024\/12\/18\/ka-kiekvienas-sistemu-programuotojas-turetu-zinoti-apie-lygiagretuma\/#Klaidingas_bendrinimas_ir_talpyklos_efektai\" >Klaidingas bendrinimas ir talpyklos efektai<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/infonaujiena.lt\/index.php\/2024\/12\/18\/ka-kiekvienas-sistemu-programuotojas-turetu-zinoti-apie-lygiagretuma\/#Lakioji_ir_atomine_sinteze\" >Lakioji ir atomin\u0117 sintez\u0117<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/infonaujiena.lt\/index.php\/2024\/12\/18\/ka-kiekvienas-sistemu-programuotojas-turetu-zinoti-apie-lygiagretuma\/#Isvada\" >I\u0161vada<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/infonaujiena.lt\/index.php\/2024\/12\/18\/ka-kiekvienas-sistemu-programuotojas-turetu-zinoti-apie-lygiagretuma\/#Papildomi_istekliai\" >Papildomi i\u0161tekliai<\/a><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"Fonas\"><\/span>Fonas<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0160iuolaikin\u0117je skai\u010diavimo aplinkoje gijos veikia vienu metu, nesvarbu, ar tai vieno branduolio, ar keli\u0173 branduoli\u0173 procesorius. \u0160ios gijos s\u0105veikauja dalindamosi b\u016bsena, o teisingam atminties operacij\u0173 i\u0161d\u0117stymo u\u017etikrinimas yra labai svarbus teisingumui. Apsvarstykite paprast\u0105 pavyzd\u012f, kai viena gija \u012fra\u0161o reik\u0161m\u0119 ir nustato v\u0117liav\u0117l\u0119, o kita gija laukia v\u0117liav\u0117l\u0117s prie\u0161 skaitydama reik\u0161m\u0119. Norint u\u017etikrinti, kad v\u0117liav\u0117l\u0117 b\u016bt\u0173 nustatyta po reik\u0161m\u0117s \u012fra\u0161ymo, reikia atid\u017eiai tvarkyti atminties operacijas.<\/p>\n<pre><code class=\"language-cpp\">int v; bool v_ready = false;\n\nvoid threadA() {\n    v = 42;\n    v_ready = true;\n}\n\nvoid threadB() {\n    while (!v_ready) { \/* wait *\/ }\n    const int my_v = v;\n    \/\/ Do something with my_v...\n}\n<\/code><\/pre>\n<h2><span class=\"ez-toc-section\" id=\"Teises_ir_tvarkos_igyvendinimas\"><\/span>Teis\u0117s ir tvarkos \u012fgyvendinimas<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Siekiant i\u0161vengti duomen\u0173 lenktyni\u0173 ir u\u017etikrinti teisingum\u0105, programavimo kalbos, tokios kaip C ir C++, pateikia atominius tipus ir operacijas. \u0160ie \u012frankiai padeda valdyti atminties operacij\u0173 tvark\u0105 gijose.<\/p>\n<pre><code class=\"language-cpp\">std::atomic_int v(0);\nstd::atomic_bool v_ready(false);\n\nvoid threadA() {\n    v = 42;\n    v_ready = true;\n}\n\nvoid threadB() {\n    while (!v_ready.load()) { \/* wait *\/ }\n    const int my_v = v.load();\n    \/\/ Do something with my_v...\n}\n<\/code><\/pre>\n<h2><span class=\"ez-toc-section\" id=\"Atomiskumas\"><\/span>Atomi\u0161kumas<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Atomin\u0117s operacijos u\u017etikrina, kad bendrinam\u0173 kintam\u0173j\u0173 skaitymas ir ra\u0161ymas b\u016bt\u0173 nedalomi. Tai apsaugo nuo nutr\u016bkusi\u0173 skaitymo ir ra\u0161ymo, kuris gali atsirasti, kai kintamasis yra didesnis nei ma\u0161inos \u017eod\u017eio dydis.<\/p>\n<pre><code class=\"language-cpp\">std::atomic&lt;int64_t&gt; counter;\n\nvoid increment() {\n    counter.fetch_add(1, std::memory_order_relaxed);\n}\n<\/code><\/pre>\n<h2><span class=\"ez-toc-section\" id=\"Skaitymo-keitimo-rasymo_operacijos\"><\/span>Skaitymo-keitimo-ra\u0161ymo operacijos<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Skaitymo-keitimo-ra\u0161ymo (RMW) operacijos yra b\u016btinos sinchronizavimo primityvams \u012fgyvendinti. \u012eprastos RMW operacijos apima keitim\u0105, palyginim\u0105 ir apsikeitim\u0105 (CAS) ir parinkim\u0105 ir prid\u0117jim\u0105.<\/p>\n<pre><code class=\"language-cpp\">std::atomic&lt;int&gt; value;\n\nint old_value = value.exchange(42);\nif (value.compare_exchange_weak(expected, desired)) {\n    \/\/ CAS succeeded\n}\n<\/code><\/pre>\n<h2><span class=\"ez-toc-section\" id=\"Atminties_uzsakymai\"><\/span>Atminties u\u017esakymai<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Atminties u\u017esakymai apibr\u0117\u017eia apribojimus, kaip kompiliatorius ir aparatin\u0117 \u012franga gali pertvarkyti operacijas. Nuoseklios operacijos suteikia stipriausias u\u017esakymo garantijas, u\u017etikrinan\u010dias vien\u0105 bendr\u0105 vis\u0173 operacij\u0173 u\u017esakym\u0105.<\/p>\n<pre><code class=\"language-cpp\">std::atomic&lt;int&gt; x(0), y(0);\n\nvoid thread1() {\n    x.store(1, std::memory_order_seq_cst);\n    int val = y.load(std::memory_order_seq_cst);\n}\n\nvoid thread2() {\n    y.store(1, std::memory_order_seq_cst);\n    int val = x.load(std::memory_order_seq_cst);\n}\n<\/code><\/pre>\n<h2><span class=\"ez-toc-section\" id=\"Isigyti_ir_isleisti\"><\/span>\u012esigyti ir i\u0161leisti<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u012esigijimo ir i\u0161leidimo u\u017esakymai suteikia vienpus\u0117s atminties kli\u016btis, u\u017etikrinan\u010dias, kad operacijos kritin\u0117je dalyje neb\u016bt\u0173 pertvarkytos per barjer\u0105.<\/p>\n<pre><code class=\"language-cpp\">std::atomic&lt;bool&gt; flag(false);\nint data;\n\nvoid producer() {\n    data = 42;\n    flag.store(true, std::memory_order_release);\n}\n\nvoid consumer() {\n    while (!flag.load(std::memory_order_acquire)) { \/* spin *\/ }\n    \/\/ data is now visible\n}\n<\/code><\/pre>\n<h2><span class=\"ez-toc-section\" id=\"Atpalaiduotos_operacijos\"><\/span>Atpalaiduotos operacijos<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Ramios operacijos suteikia silpniausias u\u017esakymo garantijas ir yra naudingos, kai nereikia atlikti specialaus u\u017esakymo.<\/p>\n<pre><code class=\"language-cpp\">std::atomic&lt;int&gt; counter(0);\n\nvoid increment() {\n    counter.fetch_add(1, std::memory_order_relaxed);\n}\n<\/code><\/pre>\n<h2><span class=\"ez-toc-section\" id=\"Klaidingas_bendrinimas_ir_talpyklos_efektai\"><\/span>Klaidingas bendrinimas ir talpyklos efektai<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Talpyklos suderinamumo protokolai gali sukelti na\u0161umo kli\u016btis d\u0117l klaidingo bendrinimo, kai nesusij\u0119 kintamieji turi t\u0105 pa\u010di\u0105 talpyklos eilut\u0119.<\/p>\n<pre><code class=\"language-cpp\">struct RMLock {\n    int readers;\n    bool writer_flag;\n    char padding(CACHE_LINE_SIZE - sizeof(int) - sizeof(bool));\n};\n<\/code><\/pre>\n<h2><span class=\"ez-toc-section\" id=\"Lakioji_ir_atomine_sinteze\"><\/span>Lakioji ir atomin\u0117 sintez\u0117<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>The <code>volatile<\/code> raktinis \u017eodis n\u0117ra tinkamas lygiagretumo \u012frankis. Tai nesuteikia reikiam\u0173 u\u017esakymo ir atomi\u0161kumo garantij\u0173.<\/p>\n<pre><code class=\"language-cpp\">volatile int shared_var; \/\/ Incorrect for concurrency\n<\/code><\/pre>\n<h2><span class=\"ez-toc-section\" id=\"Isvada\"><\/span>I\u0161vada<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Lygiagretumas yra sud\u0117tinga tema, ta\u010diau pagrindini\u0173 atomi\u0161kumo, tvarkos ir sinchronizavimo s\u0105vok\u0173 supratimas gali pad\u0117ti sistem\u0173 programuotojams para\u0161yti teising\u0105 ir efektyv\u0173 lygiagret\u0173 kod\u0105. Naudodami tinkamus \u012frankius ir metodus, programuotojai gali i\u0161vengti \u012fprast\u0173 sp\u0105st\u0173 ir sukurti tvirtas lygiagre\u010dias sistemas.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Papildomi_istekliai\"><\/span>Papildomi i\u0161tekliai<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<\/p><\/div>\n<p>Jei tekste radote klaid\u0105, si\u0173skite prane\u0161im\u0105 autoriui pa\u017eym\u0117dami klaid\u0105 ir paspausdami Ctrl-Enter.<\/p>\n<div>\n<p>        Nor\u0117dami komentuoti, turite b\u016bti prisijung\u0119.<\/p>\n<p>                <i class=\"fa icon-login\"\/>  Prisijunkite<\/p>\n<\/p><\/div>\n<p><br \/>\n<br \/><a href=\"https:\/\/techplanet.today\/post\/what-every-systems-programmer-should-know-about-concurrency\">Source link <\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Lygiagretumas yra pagrindinis \u0161iuolaikinio skai\u010diavimo aspektas, leid\u017eiantis efektyviai panaudoti i\u0161teklius ir pagerinti na\u0161um\u0105. Ta\u010diau tai sukelia sud\u0117tingumo, d\u0117l kurio gali kilti subtili\u0173 ir sunkiai derinam\u0173 problem\u0173. \u0160iame straipsnyje ap\u017evelgiamos pagrindin\u0117s s\u0105vokos ir \u012frankiai, kuriuos sistem\u0173 programuotojai turi suprasti, kad gal\u0117t\u0173 veiksmingai valdyti lygiagretum\u0105. Fonas \u0160iuolaikin\u0117je skai\u010diavimo aplinkoje gijos veikia vienu metu, nesvarbu, ar tai vieno [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":1243,"comment_status":"","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[3],"tags":[555,134,2398,2400,2399,1998,812,380],"class_list":["post-1242","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-technologijos","tag-apie","tag-ka","tag-kiekvienas","tag-lygiagretuma","tag-programuotojas","tag-sistemu","tag-turetu","tag-zinoti"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/infonaujiena.lt\/index.php\/wp-json\/wp\/v2\/posts\/1242","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/infonaujiena.lt\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/infonaujiena.lt\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/infonaujiena.lt\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/infonaujiena.lt\/index.php\/wp-json\/wp\/v2\/comments?post=1242"}],"version-history":[{"count":0,"href":"https:\/\/infonaujiena.lt\/index.php\/wp-json\/wp\/v2\/posts\/1242\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/infonaujiena.lt\/index.php\/wp-json\/wp\/v2\/media\/1243"}],"wp:attachment":[{"href":"https:\/\/infonaujiena.lt\/index.php\/wp-json\/wp\/v2\/media?parent=1242"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/infonaujiena.lt\/index.php\/wp-json\/wp\/v2\/categories?post=1242"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/infonaujiena.lt\/index.php\/wp-json\/wp\/v2\/tags?post=1242"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}