﻿
{"id":4783,"date":"2016-07-24T18:43:49","date_gmt":"2016-07-24T18:43:49","guid":{"rendered":"http:\/\/www.gencayyildiz.com\/blog\/?p=4783"},"modified":"2016-07-24T18:48:55","modified_gmt":"2016-07-24T18:48:55","slug":"cta-volatile-anahtar-sozcugu","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/cta-volatile-anahtar-sozcugu\/","title":{"rendered":"C#&#8217;ta volatile Anahtar S\u00f6zc\u00fc\u011f\u00fc"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<br \/>\nC# dili, yap\u0131sal olarak di\u011fer diller gibi bir gramere ve bu gramer \u00e7er\u00e7evesinde in\u015fa edilebilir yap\u0131lara ve bu yap\u0131lar\u0131 olu\u015fturmam\u0131z\u0131 sa\u011flayan temel yap\u0131 birimleri diye nitelendirece\u011fimiz kodlara sahip geni\u015f ve hatta derya deniz diyebilece\u011fimiz bir programlama dilidir. Dilin hakimiyetini sa\u011flayabilmek i\u00e7in bu \u00fc\u00e7 a\u00e7\u0131dan da i\u00e7i dolu bilgi ve tecr\u00fcbe gerektiren yaz\u0131l\u0131m zanaatkarl\u0131\u011f\u0131nda i\u015fte bu \u015fartlar yerini buldu\u011funda i\u015fin kurmay\u0131 k\u0131vam\u0131na gelinebilmektedir.<\/p>\n<p>Haliyle bizde kurmayl\u0131k yolunda bir ad\u0131m daha atabilmek i\u00e7in volatile keyword\u00fc \u00fczerine derin ve detayl\u0131 bir i\u00e7erik olu\u015fturacak ve C# dilinde \u00e7ok nazik bir noktaya temas eden bu anahtar s\u00f6zc\u00fc\u011f\u00fcn sizlere kafiyesini tatt\u0131raca\u011f\u0131m.<\/p>\n<p>Ba\u015flamadan \u00f6nce i\u00e7eri\u011fimizde; de\u011fi\u015fkenlerin okunmas\u0131 yahut tekrar yaz\u0131lmas\u0131 durumlar\u0131nda microi\u015flemlerin nas\u0131l bir mant\u0131kta hareket etti\u011fi ve bu seyrin asenkron bir altyap\u0131da nelere mal olabilece\u011fi \u00fczerinde konu\u015faca\u011f\u0131m\u0131z\u0131 bildirir, k\u0131saca de\u011fi\u015fkenlerin okunmas\u0131, microi\u015flemcinin s\u00fcre\u00e7teki algoritmas\u0131 ve asenkron \u00e7er\u00e7evede bu durumlar\u0131n de\u011ferlendirmesini ele alaca\u011f\u0131m\u0131z\u0131 bilmenizi ister ve bu \u00f6n bilgilere d\u00f6n\u00fck beklentiyle i\u00e7eri\u011fi okuman\u0131z\u0131 tavsiye ederim.<\/p>\n<p>\u015eimdi \u00f6ncelikle \u015funu bilmenizi istiyorum. Bir program yazd\u0131n\u0131z ve program i\u00e7erisinde de\u011fi\u015fkenleriniz var. Mikroi\u015flemci, ilgili de\u011fi\u015fkenleri kullan\u0131rken her defas\u0131nda daha h\u0131zl\u0131 ve pratik olabilmek i\u00e7in bu de\u011fi\u015fkenleri bellekten almak yerine kendi i\u00e7erisinde s\u0131n\u0131rl\u0131 say\u0131da bulunan <em>Data Register<\/em> diye nitelendirilen kay\u0131t\u00e7\u0131lara bu de\u011fi\u015fkenleri de\u011ferleriyle birlikte kaydeder ve burada tutar.<\/p>\n<p>Burada \u015fu soruyu soral\u0131m. De\u011fi\u015fkenlerin, bellekte ya da data registerda tutulmas\u0131n\u0131n fark\u0131 ve faydas\u0131 nedir? Sorunun tek cevab\u0131 h\u0131z ve performanst\u0131r.<\/p>\n<p>Mikroi\u015flemci bir de\u011fi\u015fkene data registerdan, belle\u011fe oranla kat kat h\u0131zl\u0131 eri\u015febilir ve y\u00fczden b\u00f6yle bir \u00e7al\u0131\u015fma ger\u00e7ekle\u015ftirir. Hem herhangi bir T zamanda tek i\u015flem yapabilecek mikroi\u015flemciler i\u00e7in bu olmazsa olmaz bir alternatif de\u011fil midir?<\/p>\n<p>Bu \u00e7al\u0131\u015fma d\u00fczene\u011finin bir di\u011fer boyutu, yukar\u0131da bahsetti\u011fim gibi data register alan\u0131nda sadece salt de\u011fi\u015fkenler de\u011fil, onlar\u0131n de\u011ferleride tutulmaktad\u0131r. Derleyici, baz\u0131 de\u011fi\u015fkenlerin de\u011ferini her defas\u0131nda bellekten okuyaca\u011f\u0131na bu de\u011fi\u015fkenin de\u011ferini bir defaya mahsus data register alan\u0131na kaydedebilir. Dikkat ederseniz kaydetti\u011fi bu de\u011feri sonraki \u00e7a\u011fr\u0131mlarda bellekten de\u011fil bu data register \u00fczerinden getirebilmektedir. Evet, hal b\u00f6yleyken m\u00fckemmel bir performans ve h\u0131z kazanc\u0131 s\u00f6z konusu olacakt\u0131r.<\/p>\n<p>Ammaaaa!!!<\/p>\n<p>Siz hi\u00e7 bu kadar ucuz h\u0131z ve performans g\u00f6rd\u00fcn\u00fcz m\u00fc? Yaz\u0131l\u0131mda her art\u0131n\u0131n bir bedeli oldu\u011fu gibi bu mekanizman\u0131nda bir amas\u0131 vard\u0131r.<\/p>\n<p>D\u00fc\u015f\u00fcn\u00fcn ki, herhangi bir T zamanda data registera kaydedilen bir de\u011fi\u015fken herhangi bir T++ zaman \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda data registerdaki kay\u0131ttan gelecektir. Evet, bir s\u0131k\u0131nt\u0131 g\u00f6z\u00fckm\u00fcyor. Peki olay\u0131 \u015f\u00f6yle d\u00fc\u015f\u00fcn\u00fcrsek, herhangi bir T zamanda data registera kaydedilen bir de\u011fi\u015fkenin de\u011feri herhangi bir T++ zamanda de\u011fi\u015ftirilmekte lakin bu de\u011fi\u015fiklik an\u0131nda data registera yans\u0131t\u0131lmama ihtimali oldu\u011fundan herhangi bir T+++ zamanda de\u011fi\u015fkenin de\u011feri \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda eski de\u011feri getirme ihtimali olacakt\u0131r.<\/p>\n<p>Eee&#8230; Olur mu b\u00f6yle bir\u015fey!!!? Biz yazd\u0131\u011f\u0131m\u0131z programlar\u0131 insanlardan daha h\u0131zl\u0131 i\u015flem yapabildikleri ve veri organize edebildikleri i\u00e7in derlemiyor muyuz? Yazaca\u011f\u0131m bir program\u0131n anl\u0131k g\u00fcncel verileri ta\u015f\u0131yamamas\u0131 yahut o verilerle \u00e7al\u0131\u015famamas\u0131 sonucunda ne anlar\u0131z \u00f6yle yaz\u0131l\u0131mdan&#8230;<\/p>\n<p>Her neyse&#8230; Konumuza d\u00f6nelim&#8230;<\/p>\n<p>Yukar\u0131da yazm\u0131\u015f oldu\u011fum son paragraftanda \u00e7\u0131karabilece\u011fimiz gibi nas\u0131l olu\u015fturulan de\u011fi\u015fkenler de\u011ferleriyle birlikte bellekten data registera ta\u015f\u0131n\u0131yorlarsa, ayn\u0131s\u0131n\u0131 de\u011fi\u015fkenin de\u011ferini de\u011fi\u015ftirdi\u011fimiz durumda da ger\u00e7ekle\u015ftirmektedirler. Ama bu de\u011fi\u015ftirme durumunda bir gecikme s\u00f6z konusu olabilir. \u00d6rn; 3. sat\u0131rda yap\u0131lan bir de\u011fi\u015fiklik 5. sat\u0131rda data registera yans\u0131m\u0131\u015f olabilir. Ee haliyle art\u0131k \u00e7ok ge\u00e7 olmu\u015fta olabilir&#8230; Bu gecikme s\u00fcresi mikroi\u015flemcinin o anki durumuna g\u00f6re de\u011fi\u015fkenlik g\u00f6stermektedir.<\/p>\n<p>Bu mekanizma kar\u015f\u0131s\u0131nda birde madolyonun \u00f6teki y\u00fcz\u00fc var ki zaten i\u015f genellikle burada kopuyor. Multi Thread temelli yani asenkron \u00e7al\u0131\u015fmalarda farkl\u0131 processler kendi aralar\u0131nda de\u011fi\u015fkenleri kullanabilmektedirler. Ya da bir i\u015f par\u00e7ac\u0131\u011f\u0131(Thread) farkl\u0131 bir i\u015f par\u00e7ac\u0131\u011f\u0131n\u0131n kulland\u0131\u011f\u0131 de\u011fi\u015fken \u00fczerinde i\u015flemler ger\u00e7ekle\u015ftirebilir.<\/p>\n<p>\u0130\u015fte bu tarz kutupsal \u00e7al\u0131\u015fmalarda yukar\u0131daki olas\u0131 gecikmeli durumu genelleyiniz. Durun size bu konuda tahayy\u00fcl edebilmeniz i\u00e7in yard\u0131mc\u0131 olay\u0131m.<\/p>\n<p>Asenkron \u00e7al\u0131\u015f\u0131yorsunuz&#8230;<br \/>\nYani senkron bir i\u015flemden daha kompleks ve y\u00f6netilebilirli\u011fi zor bir durumdas\u0131n\u0131z&#8230;<br \/>\nSat\u0131r sat\u0131r de\u011fil, b\u00fct\u00fcnsel hareket ediyorsunuz&#8230;<\/p>\n<p>Eee i\u015fte b\u00f6yle bir durumda, yukar\u0131larda bahsetti\u011fimiz gibi senkron olarak tasarlanm\u0131\u015f bir programdaki de\u011fi\u015fkenlerde olas\u0131 gecikmeli data register kay\u0131tlar\u0131nda \u00e7al\u0131\u015fma ihtimalimizdeki (<em>olas\u0131d\u0131r ama \u00e7ok d\u00fc\u015f\u00fck bir ihtimaldir<\/em>)zay\u0131fl\u0131k, asenkron yakla\u015f\u0131mda g\u00fc\u00e7lenmekte ve art\u0131k farkl\u0131 bir kontrol ile \u00e7al\u0131\u015fma gerektirmektedir.<\/p>\n<p>Yok e\u011fer kontrol sa\u011flayamazsak farkl\u0131 thread yahut processler ayn\u0131 de\u011fi\u015fken \u00fczerinde \u00e7al\u0131\u015f\u0131rken ilgili de\u011fi\u015fkenin de\u011ferini bellekten de\u011fil gene data registerdan alacakt\u0131rlar. Ama bu s\u00fcre\u00e7 esnas\u0131nda data registera yans\u0131mam\u0131\u015f g\u00fcncellemeler ger\u00e7ekle\u015fmi\u015f olabilir lakin b\u00f6yle bir olas\u0131 durumda biz yaz\u0131l\u0131mc\u0131lar\u0131n bu son de\u011ferden bi haber olaca\u011f\u0131m\u0131z kesindir. Derleyici bir de\u011fi\u015fkenin de\u011ferinin farkl\u0131 thread yahut processler taraf\u0131ndan i\u015flenece\u011fi \u00fczerinde durmayacakt\u0131r. Bu i\u015flem i\u015fletim sisteminin y\u00f6netiminde oldu\u011fu i\u00e7in bu konuda ilgili birimlerden pek fazla beklentide olmam\u0131z do\u011fru olmayacakt\u0131r.<\/p>\n<p><em><strong>Peki alabilece\u011fimiz \u00f6nlem ve yapabilece\u011fimiz kontrol nedir?<\/strong><\/em><br \/>\nAsenkron yakla\u015f\u0131m sergilerken yapmam\u0131z gereken tek i\u015flem thread yahut processlerin ortak \u00e7al\u0131\u015ft\u0131\u011f\u0131 de\u011fi\u015fkenin de\u011ferinin bellekten gelip gelmedi\u011fini bilmektir. Tabi ki de tercihimiz bellek olacakt\u0131r. \u00c7\u00fcnk\u00fc yap\u0131lan t\u00fcm g\u00fcncelleme ve de\u011fi\u015fiklikler direkt olarak anl\u0131k belle\u011fe yans\u0131yaca\u011f\u0131ndan dolay\u0131 i\u015fte bu tarz durumlarda do\u011fru bir se\u00e7im olacakt\u0131r. Bu \u015fe\u00e7imide i\u00e7eri\u011fimizin as\u0131l konusu olan <strong><em>volatile<\/em><\/strong> anahtar s\u00f6zc\u00fc\u011f\u00fc ile ger\u00e7ekle\u015ftirebilmekteyiz. Yani volatile keyword\u00fc bunca anlatt\u0131\u011f\u0131m durum \u00fczerine bizim kontrol yapmam\u0131z\u0131 sa\u011flayacak anahtar\u0131m\u0131z olacakt\u0131r.<\/p>\n<p>Volatile keyword\u00fc, i\u015faretledi\u011fi de\u011fi\u015fkenin data register optimizasyonuna u\u011framadan direkt olarak bellek \u00fczerinden temas\u0131n\u0131 ger\u00e7ekle\u015ftirir. Yap\u0131lan g\u00fcncellemeler anl\u0131k belle\u011fe yans\u0131yacak ve son g\u00fcncellemeler ne ise onlarla \u00e7al\u0131\u015f\u0131lacakt\u0131r. H\u0131z imi\u015f, performans imi\u015f k\u00e2rdan zarara u\u011frayacakt\u0131r. Eee haliyle asenkron alt yap\u0131da farkl\u0131 thread yahut processler ayn\u0131 de\u011fi\u015fken \u00fczerinde yo\u011funla\u015ft\u0131\u011f\u0131nda direkt olarak bellekten beslenecekleri i\u00e7in son veri kayg\u0131s\u0131 ya\u015fanmayacak, g\u00f6n\u00fcl rahatl\u0131\u011f\u0131yla \u00e7al\u0131\u015f\u0131labilecektir.<\/p>\n<blockquote><p>volatile keyword\u00fcn\u00fcn, san\u0131ld\u0131\u011f\u0131 \u00fczere yaz ge\u00e7 usul\u00fc kullan\u0131lmamas\u0131 gereken ve bilakis epey ayr\u0131nt\u0131l\u0131 ve dikkatli olunmas\u0131 gereken bir konu oldu\u011funa dikkatinizi \u00e7ekerim.<\/p><\/blockquote>\n<p>\u015eimdi volatile \u00fczerine pratik \u00f6rnekler inceleyelim.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class Program\r\n    {\r\n        volatile bool x;\r\n        volatile int y;\r\n        string z;\r\n    }\r\n<\/pre>\n<p>Kod blo\u011funda g\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi volatile ile i\u015faretlenmi\u015f de\u011fi\u015fkenler direkt olarak bellekten beslenmekteyken i\u015faretlenmeyenler data register mekanizmas\u0131yla \u00e7al\u0131\u015fmaktad\u0131rlar.<\/p>\n<p>Ayriyetten bilmenizi istedi\u011fim volatile keyword\u00fc class scopeu i\u00e7erisinde olu\u015fturulan de\u011fi\u015fkenlerde kullan\u0131labilmektedir. Metod yahut property i\u00e7erisinde olu\u015fturulan de\u011fi\u015fkenlerde kullan\u0131lamamaktad\u0131r.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class Program\r\n    {\r\n        volatile static bool Durum;\r\n        volatile static int Sayi = 1;\r\n        static void Main(string&#x5B;] args)\r\n        {\r\n            Thread t = new Thread(new ThreadStart(() =&gt;\r\n            {\r\n                Sayi = 5;\r\n                Durum = true;\r\n            }));\r\n            t.Start();\r\n\r\n            while (true)\r\n            {\r\n                if (Durum)\r\n                {\r\n                    Sayi += 5;\r\n                    Console.WriteLine(Sayi);\r\n                    break;\r\n                }\r\n                Console.WriteLine(Sayi);\r\n            }\r\n\r\n            Console.Read();\r\n        }\r\n    }\r\n<\/pre>\n<p>Yukar\u0131daki \u00f6rnek kod blo\u011funu incelerseniz e\u011fer Durum ve Sayi de\u011fi\u015fkenleri volatile olarak i\u015faretlenmekte ve ilgili de\u011fi\u015fkenler farkl\u0131 bir Thread taraf\u0131ndan dahi bellekten dinlenmektedirler.<\/p>\n<p>Evet&#8230;<br \/>\nG\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi dilin baz\u0131 keywordleri \u015fudur demekle izah edilememekte, olas\u0131 olaylar zincirini senaryola\u015ft\u0131r\u0131l\u0131p bir \u015fekilde somutla\u015ft\u0131rabildikten sonra fazla \u00f6rnek verme imkan\u0131 olmadan kestirilmek mecburiyetindedir.<\/p>\n<p>Umar\u0131m faydalan\u0131rs\u0131n\u0131z&#8230;<br \/>\nOkudu\u011funuz i\u00e7in te\u015fekk\u00fcr ederim&#8230;<br \/>\nSonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<br \/>\n\u0130yi \u00e7al\u0131\u015fmalar dilerim&#8230;<\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>Merhaba, C# dili, yap\u0131sal olarak di\u011fer diller gibi bir gramere ve bu gramer \u00e7er\u00e7evesinde in\u015fa edilebilir yap\u0131lara ve bu yap\u0131lar\u0131 olu\u015fturmam\u0131z\u0131 sa\u011flayan temel yap\u0131 birimleri diye nitelendirece\u011fimiz kodlara sahip geni\u015f ve hatta derya deniz&#46;&#46;&#46;<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":3223,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12],"tags":[579,1392,1341,1394,1393],"class_list":["post-4783","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-c-sharp-c","tag-asenkron","tag-data-register","tag-multi-tasking","tag-senkron","tag-volatile"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/4783","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/comments?post=4783"}],"version-history":[{"count":0,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/4783\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/3223"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=4783"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=4783"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=4783"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}