{"id":864,"date":"2019-03-30T12:51:45","date_gmt":"2019-03-30T12:51:45","guid":{"rendered":"http:\/\/www.yazilimperver.com\/?p=864"},"modified":"2019-03-30T17:58:00","modified_gmt":"2019-03-30T17:58:00","slug":"haftalik-c-12-multithread-programlamada-karsilasilan-bazi-sikintilar","status":"publish","type":"post","link":"https:\/\/www.yazilimperver.com\/index.php\/2019\/03\/30\/haftalik-c-12-multithread-programlamada-karsilasilan-bazi-sikintilar\/","title":{"rendered":"Haftal\u0131k C++ 12 &#8211; Multithread programlamada kar\u015f\u0131la\u015f\u0131lan baz\u0131 s\u0131k\u0131nt\u0131lar"},"content":{"rendered":"<p><\/p>\n<p id=\"ajCUPkg\"><img loading=\"lazy\" decoding=\"async\" width=\"945\" height=\"443\" class=\"size-full wp-image-1090 aligncenter\" src=\"http:\/\/www.yazilimperver.com\/wp-content\/uploads\/2019\/03\/img_5c9fa1ed21d37.png\" alt=\"\" srcset=\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2019\/03\/img_5c9fa1ed21d37.png 945w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2019\/03\/img_5c9fa1ed21d37-300x141.png 300w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2019\/03\/img_5c9fa1ed21d37-768x360.png 768w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2019\/03\/img_5c9fa1ed21d37-500x234.png 500w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2019\/03\/img_5c9fa1ed21d37-150x70.png 150w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2019\/03\/img_5c9fa1ed21d37-400x188.png 400w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2019\/03\/img_5c9fa1ed21d37-800x375.png 800w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2019\/03\/img_5c9fa1ed21d37-200x94.png 200w\" sizes=\"auto, (max-width: 945px) 100vw, 945px\" \/><\/p>\n<p><span style=\"font-weight: 400;\">Merhabalar dostlar. K\u0131sa bir aradan sonra, ba\u015fka bir haftal\u0131k C++ yaz\u0131s\u0131 ile birlikteyiz. Bu yaz\u0131mda, bir s\u00fcre \u00f6nce sizler ile payla\u015ft\u0131\u011f\u0131m thread k\u00fct\u00fcphanesinin kullan\u0131m\u0131 ile ilgili baz\u0131 hatal durumlar\u0131 ve bunlar\u0131 nas\u0131l \u00f6nleyebilece\u011fimize bakaca\u011f\u0131z. Her bir duruma ayr\u0131 ba\u015fl\u0131klarda, k\u0131sa a\u00e7\u0131klama ve \u00f6rnekler ile de\u011finece\u011fiz. Buradaki durumlar\u0131n bir k\u0131sm\u0131n\u0131, yaz\u0131lar\u0131m\u0131 takip edenleriniz hat\u0131rlayacakt\u0131r, ilgili konular\u0131 anlat\u0131rken bunlara da k\u0131saca de\u011finmi\u015ftim. <\/span><\/p>\n<p><span style=\"font-weight: 400;\">Bu yaz\u0131m i\u00e7in ise kaynak\u00e7ada verdi\u011fim siteden faydaland\u0131m. Asl\u0131nda bu yaz\u0131y\u0131 thread yaz\u0131lar\u0131n\u0131 yazarken g\u00f6rm\u00fc\u015ft\u00fcm ama o zaman seriyi tamamlamad\u0131\u011f\u0131m i\u00e7in vermek istemedim, ama \u015fimdi tam zaman\u0131. O yaz\u0131da 20 ye yak\u0131n durumdan bahsedilse de, ben bu yaz\u0131mda bana g\u00f6re \u00f6nemli oldu\u011funu d\u00fc\u015f\u00fcnd\u00fcklerimi ekledim. Bu yaz\u0131 ile birlikte, bu tarz hatal\u0131 durumlar\u0131 toplu bir \u015fekilde inceleme \u015fans\u0131n\u0131z olacak, hem de thread k\u00fct\u00fcphanesinin h\u0131zl\u0131 bir tekrar\u0131n\u0131 yapm\u0131\u015f olaca\u011f\u0131z. Yaz\u0131m\u0131n sonuna ayr\u0131ca, multithreaded programlama ile ilgili faydalanabilece\u011finiz ba\u011flant\u0131lar da ekledim. Yine benzer i\u00e7erikleri sizler ile payla\u015f\u0131yor olaca\u011f\u0131m. <\/span><\/p>\n<p><span style=\"font-weight: 400;\">Evet daha fazla beklemeden ilgili problemlere bakmaya ba\u015flayal\u0131m:<\/span><\/p>\n<h2><span style=\"color: #0000ff;\"><b>1. Farkl\u0131 thread\u2019ler taraf\u0131ndan kullan\u0131lacak verilerin koruma alt\u0131na al\u0131nmamas\u0131:<\/b><\/span><\/h2>\n<p><span style=\"font-weight: 400;\"><strong><a href=\"http:\/\/www.yazilimperver.com\/index.php\/2019\/03\/08\/haftalik-c-10-stdthread-iii\/\">Bir \u00f6nceki yaz\u0131m\u0131zda<\/a> <\/strong>g\u00f6rd\u00fc\u011f\u00fcm\u00fcz \u00fczere, multithreaded programlama\u2019da kar\u015f\u0131la\u015faca\u011f\u0131n\u0131z en yayg\u0131n problem, thread\u2019ler aras\u0131 payla\u015f\u0131lan verilerin korunmamas\u0131d\u0131r. <\/span><\/p>\n<p><span style=\"font-weight: 400;\">Siz zaten bu problemi ve bunu nas\u0131l \u00e7\u00f6zebilece\u011finizi bir \u00f6nceki yaz\u0131mdan biliyorsunuzdur \ud83d\ude42 Evet, do\u011fru tahmin ettiniz, ilgili kritik b\u00f6lgeleri <em>std::mutex<\/em> ve benzeri yap\u0131lar ile korumak. Bu sayede, ilgili veriye ayn\u0131 anda sadece bir thread\u2019in eri\u015fti\u011fini teminat alt\u0131na alm\u0131\u015f olacaks\u0131n\u0131z. Peki burada ger\u00e7ekle\u015ftirilen olay neydi? Temel olarak ger\u00e7ekle\u015ftirilen: payla\u015f\u0131lan veri ile \u00e7al\u0131\u015facak thread, ilgili kritik b\u00f6lgeye girmeden \u00f6nce, <em>std::mutex<\/em>\u2019i kilitler ve veri ile olan i\u015fini ger\u00e7ekle\u015ftirir ve sonras\u0131nda bu kilidi kald\u0131r\u0131r. Bu sayede, ilgili veri ile \u00e7al\u0131\u015fmak isteyen di\u011fer threadler bu veri \u00fczerinde \u00e7al\u0131\u015fabilir ve g\u00fcvenli bir \u015fekilde g\u00fcncelleyebilirler.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Burada elbette s\u0131k\u0131nt\u0131l\u0131 durumun, herhangi bir thread\u2019in, payla\u015f\u0131lan veriyi g\u00fcncellemek istedi\u011fi durumunda olu\u015faca\u011f\u0131n\u0131 hat\u0131rlatmak istiyorum. Yoksa, e\u011fer b\u00fct\u00fcn thread\u2019ler payla\u015f\u0131lan verileri sadece okuyor\/kullan\u0131yor ise, herhangi bir problem ile kar\u015f\u0131la\u015fmayacaks\u0131n\u0131z. <\/span><\/p>\n<p><span style=\"font-weight: 400;\">Bu ba\u015fl\u0131k biraz bunu hat\u0131rlatmaya y\u00f6nelikti.<\/span><\/p>\n<h2><span style=\"color: #0000ff;\"><b>2. Kritik b\u00f6lge kilidinin kald\u0131r\u0131lmamas\u0131:<\/b><\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Bir \u00f6nceki problemde, ortak verilere, birden fazla thread taraf\u0131ndan eri\u015fip, tutarl\u0131 bir \u015fekilde kullan\u0131lmas\u0131 i\u00e7in, <em>std::mutex<\/em> ve benzeri yap\u0131lar\u0131n kullan\u0131lmas\u0131 gerekti\u011fini ifade ettik ve nas\u0131l kullan\u0131laca\u011f\u0131n\u0131 basit bir \u00f6rnek ile g\u00f6sterdik. Peki bunlar\u0131 do\u011fru kullanmazsak ne olur? \u00d6rne\u011fin, ilgili kritik b\u00f6lgeye girdi\u011finizde kilidi aktfile\u015ftirdiniz ama i\u015finiz bitti\u011finde, kilidi kald\u0131rmad\u0131n\u0131z ne olacak? Evet, do\u011fru tahmin ettiniz, bu veriye eri\u015fip, kullanmak isteyen di\u011fer thread\u2019ler, bu veriye eri\u015fmek a\u015fk\u0131 ile yan\u0131p k\u00fcl olacaklar ama yine de eri\u015femeyecekler. Sonu\u00e7 olarak, uygulaman\u0131z as\u0131l\u0131 kalacak.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Peki bunu \u00f6nlemek i\u00e7in ne yapabiliriz? Bu ama\u00e7la sunulan, yard\u0131mc\u0131 yap\u0131lar\u0131 kullanabiliriz (tabi kilidi ilgili API&#8217;yi kullanarak kald\u0131rman\u0131n yan\u0131nda), bunlar\u0131n da en \u00f6nemlisi, <em>std::mutex<\/em> ve ilgili kilitleme\/kilidi kald\u0131rma API\u2019leri yerine, RAII (<em>Resource Acquisition Is Initialization)<\/em> tabanl\u0131 <\/span><b><i>std::lock_guard <\/i><\/b><span style=\"font-weight: 400;\">benzeri yap\u0131lar\u0131 daha s\u0131k kullanmak olacakt\u0131r. Bu sayede, kilidi kald\u0131rmay\u0131 unutma gibi bir derdiniz de olmayacak. Ne zamanki <em>lock_guard<\/em> nesneleri, tan\u0131ml\u0131 kapsamlar\u0131 d\u0131\u015f\u0131nda \u00e7\u0131k\u0131nca, otomatik olarak ilgili mutex\u2019lerin kilidini kald\u0131r\u0131yor olacaklar. <\/span><\/p>\n<p><span style=\"font-weight: 400;\">Asl\u0131nda, her ne kadar bu yakla\u015f\u0131m \u00e7ok uzun bir s\u00fcredir bilinse de, modern C++ bunu ak\u0131ll\u0131 i\u015faret\u00e7iler ve benzeri yard\u0131mc\u0131 yap\u0131lar ile daha kolayla\u015ft\u0131rd\u0131. Bana kal\u0131rsa, bu tarz yap\u0131lar\u0131n, bir di\u011fer avantaj\u0131 da kodu daha okunabilir yapmalar\u0131.\u00a0<\/span><\/p>\n<h2><span style=\"color: #0000ff;\"><b>3. \u0130lgili std::mutex\u2019in iki kere kilitlenmesi:<\/b><\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Herhangi bir mutex\u2019in iki kere kilitlenmesi bir \u00e7ok thread k\u00fct\u00fcphanesinde, beklenmedik davran\u0131\u015flara sebep olabilir ve bu da \u00e7o\u011funlukla uygulaman\u0131n \u00e7ak\u0131lmas\u0131 \u015feklinde ortaya \u00e7\u0131kacakt\u0131r. Burada dikkat edilecek iki durum var: birincisi, ilgili mutex\u2019in yanl\u0131\u015fl\u0131kla iki kere kilitlenmesi di\u011fer ise b\u00f6yle bir ihtiyac\u0131n olmas\u0131. <\/span><\/p>\n<p><span style=\"font-weight: 400;\">\u0130lki i\u00e7in dikkatli olmak ve ilgili hatay\u0131 d\u00fczeltmekten ba\u015fka \u00e7areniz yok ama ikincisi i\u00e7in bir <strong><span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"http:\/\/www.yazilimperver.com\/index.php\/2019\/03\/08\/haftalik-c-10-stdthread-iii\/\">\u00f6nceki yaz\u0131mda bahsetti\u011fim<\/a><\/span><\/strong> <em>std::recursive_mutex<\/em> s\u0131n\u0131f\u0131n\u0131 kullanabilirisiniz (iligli yaz\u0131da Calculator s\u0131n\u0131f\u0131nda buna ili\u015fkin bir \u00f6rne\u011fe bakm\u0131\u015ft\u0131k). Tabi, ilk durumda bahsetti\u011fim hatay\u0131 \u00f6nlemek i\u00e7in de <em>std::recursive_mutex<\/em> kullanabilirsiniz ama bu do\u011fru bir yakla\u015f\u0131m de\u011fil ve bunu yapmamal\u0131s\u0131n\u0131z \ud83d\ude42<\/span><\/p>\n<h2><span style=\"color: #0000ff;\"><b>4. Korunmas\u0131 gereken kritik b\u00f6lgeyi uzun tutmak<\/b><\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Bir di\u011fer g\u00f6z \u00f6n\u00fcnde bulundurulmas\u0131 gereken ve \u00f6zellikle beklenmedik beklemelere yol a\u00e7an durum, kritik b\u00f6lgelerin uzun tutulmas\u0131. Bir di\u011fer ifade ile, bu b\u00f6lgelerde yap\u0131lan i\u015flerin \u00e7ok fazla olmas\u0131. Burada amac\u0131m\u0131z basit: bu b\u00f6lgelerde yap\u0131lan i\u015fleri olabildi\u011fince azaltmak, payla\u015f\u0131lan kritik veri ile ilgili olmaya b\u00fct\u00fcn i\u015fleri, bu b\u00f6lge d\u0131\u015f\u0131nda, mutex\u2019in kapsam\u0131 d\u0131\u015f\u0131nda, tutmak. Bu anlamda, <em>std::scoped_lock<\/em> s\u0131n\u0131flar\u0131n\u0131 kullanman\u0131z\u0131 \u00f6neriyorum.<\/span><\/p>\n<h2><span style=\"color: #0000ff;\"><b>5. \u00c7oklu mutex kullan\u0131lmas\u0131 durumunda, kilitleme s\u0131ras\u0131n\u0131n kar\u0131\u015ft\u0131r\u0131lmas\u0131<\/b><\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Geldik, bir di\u011fer \u00f6nemli probleme. Bir \u00f6nceki yaz\u0131mda, \u201c<em>deadlock<\/em>\u201d durumundan, yani thread\u2019lerin birbirlerini sonsuza dek beklemeleri durumundan bahsetmi\u015ftim. \u0130\u015fte bunun en \u00f6nemli sebeplerinden birisi de bu. Yani birden fazla thread\u2019in, birden fazla mutex\u2019i farkl\u0131 s\u0131ralar ile kilitleyip, kilidini kald\u0131rmaya \u00e7al\u0131\u015fmas\u0131. \u00d6ncelikle iki thread i\u00e7in bu durumun nas\u0131l olabilece\u011fine bakal\u0131m:<\/span><\/p>\n<table>\n<tbody>\n<tr>\n<td><b>Thread 1<\/b><\/td>\n<td><b>Thread 2<\/b><\/td>\n<\/tr>\n<tr>\n<td><strong>A Mutex\u2019ini kilitle<\/strong><\/p>\n<p>\/\/.. Bir \u015feyler yapal\u0131m<\/p>\n<p><strong>B Mutex\u2019ini kilitle<\/strong><\/p>\n<p>\/\/ .. Daha da bir \u015feyler yapal\u0131m<\/p>\n<p>B Mutex\u2019inin kilidini kald\u0131r<\/p>\n<p>A Mutex\u2019inin kilidini kald\u0131r<\/td>\n<td><strong>B Mutex\u2019ini kilitle<\/strong><\/p>\n<p>\/\/.. Bir \u015feyler yapal\u0131m<\/p>\n<p><strong>A Mutex\u2019ini kilitle<\/strong><\/p>\n<p>\/\/.. Daha da bir \u015feyler yapal\u0131m<\/p>\n<p>A Mutex\u2019inin kilidini kald\u0131r<\/p>\n<p>B Mutex\u2019inin kilidini kald\u0131r<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u015eimdi Thread 1\u2019in A mutex\u2019inin kilitledi\u011fi s\u0131rada, Thread 2\u2019nin de B Mutex\u2019ini kilitledi\u011fini d\u00fc\u015f\u00fcnelim. Ne olur? Thread 1, B mutex\u2019ini kilitlemeye \u00e7al\u0131\u015ft\u0131\u011f\u0131 zaman, bu mutex, A taraf\u0131ndan kilitlendi\u011fi i\u00e7in bloklanacak ve bekleyecek. Benzer \u015fekilde Thread 2\u2019de A mutexi i\u00e7in bekleyecek ve \u201cDeadlock\u201d dedi\u011fimiz durum, i\u015fte tam bu noktada olu\u015facak.<\/p>\n<p id=\"YeXwRxx\"><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-1089 aligncenter\" src=\"http:\/\/www.yazilimperver.com\/wp-content\/uploads\/2019\/03\/img_5c9fa18d7203c.png\" alt=\"\" width=\"280\" height=\"278\" srcset=\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2019\/03\/img_5c9fa18d7203c.png 367w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2019\/03\/img_5c9fa18d7203c-150x149.png 150w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2019\/03\/img_5c9fa18d7203c-300x298.png 300w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2019\/03\/img_5c9fa18d7203c-200x198.png 200w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2019\/03\/img_5c9fa18d7203c-57x57.png 57w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2019\/03\/img_5c9fa18d7203c-72x72.png 72w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2019\/03\/img_5c9fa18d7203c-114x114.png 114w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2019\/03\/img_5c9fa18d7203c-144x144.png 144w\" sizes=\"auto, (max-width: 280px) 100vw, 280px\" \/><\/p>\n<p>A\u015fa\u011f\u0131da verilen \u00f6rnek kod, burada bahsetti\u011fimiz durumu ortaya koyuyor:<\/p>\n<pre class=\"lang:c++ decode:true\">#include &lt;iostream&gt;\r\n#include &lt;string&gt;\r\n#include &lt;thread&gt;\r\n#include &lt;mutex&gt;\r\n\r\nusing namespace std;\r\n\r\nstd::mutex muA;\r\nstd::mutex muB;\r\n\r\nvoid printMessage1(const string&amp; message)\r\n{\r\n\tmuA.lock();\r\n\r\n\t\/\/ Biraz bekleme\r\n\tstd::this_thread::sleep_for(std::chrono::milliseconds(100));\r\n\r\n\tmuB.lock();\r\n\tcout &lt;&lt; \"Thread \" &lt;&lt; this_thread::get_id() &lt;&lt; \" says \" &lt;&lt; message &lt;&lt; endl;\r\n\tmuB.unlock();\r\n\tmuA.unlock();\r\n\r\n}\r\n\r\nvoid printMessage2(const string&amp; message)\r\n{\r\n\tmuB.lock();\r\n\r\n\t\/\/ Biraz bekleme\r\n\tstd::this_thread::sleep_for(std::chrono::milliseconds(100));\r\n\r\n\tmuA.lock();\r\n\tcout &lt;&lt; \"Thread \" &lt;&lt; this_thread::get_id() &lt;&lt; \" says \" &lt;&lt; message &lt;&lt; endl;\r\n\t\r\n\tmuA.unlock();\r\n\tmuB.unlock();\r\n}\r\n\r\nint main()\r\n{\r\n\tthread t1(printMessage1, \"Hello from Jupiter\");\r\n\tthread t2(printMessage2, \"Hello from Pluto\");\r\n\r\n\tt1.join();\r\n\tt2.join();\r\n\treturn 0;\r\n}<\/pre>\n<p>Peki bu durumu \u00f6nlemek i\u00e7in ne yapacaks\u0131n\u0131z? \u00d6ncelikle, bu tarz \u00e7oklu mutex kullan\u0131lmas\u0131 durumunda ayn\u0131 s\u0131ray\u0131 takip etmek olacakt\u0131r.<\/p>\n<p>Ayr\u0131ca, yine bir \u00f6nceki yaz\u0131mda bahsetti\u011fim ve \u00e7oklu mutex alan <em>std::scoped_lock<\/em> tarz\u0131 s\u0131n\u0131flar\u0131 kullanmak olacakt\u0131r.<\/p>\n<pre class=\"lang:c++ decode:true\">\/\/ Coklu mutex kilitlenir\r\nstd::scoped_lock lock{muA, muB};<\/pre>\n<h2><span style=\"color: #0000ff;\"><b>6. join()\/detach() metotlar\u0131n\u0131 \u00e7a\u011f\u0131rmay\u0131 unutmak<\/b><\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Asl\u0131nda ba\u015fl\u0131k, ilgili problemi net bir \u015fekilde tan\u0131ml\u0131yor. Peki neden bu metotlar\u0131 \u00e7a\u011f\u0131rmaya ihtiya\u00e7 duyuyoruz ve \u00e7a\u011f\u0131rmaz isek ne olur? E\u011fer thread\u2019lerin tamamlanmas\u0131n\u0131 beklemeden <\/span><i><span style=\"font-weight: 400;\">main()\u00a0<\/span><\/i><span style=\"font-weight: 400;\">metodundan \u00e7\u0131karsan\u0131z, thread\u2019ler i\u015flerini d\u00fczg\u00fcn bir \u015fekilde tamamlamad\u0131klar\u0131 i\u00e7in, b\u00fct\u00fcn uygulaman\u0131z\u0131n g\u00f6\u00e7t\u00fc\u011f\u00fcn\u00fc g\u00f6receksiniz. <\/span><\/p>\n<p><span style=\"font-weight: 400;\">Bu sebeple thread\u2019ler ile \u00e7al\u0131\u015f\u0131rken, birle\u015ftirmek i\u00e7in <\/span><i><span style=\"font-weight: 400;\">join()<\/span><\/i><span style=\"font-weight: 400;\"> ya da ay\u0131rmak i\u00e7in <\/span><i><span style=\"font-weight: 400;\">detach()<\/span><\/i><span style=\"font-weight: 400;\"> API\u2019lerini \u00e7a\u011f\u0131rd\u0131\u011f\u0131n\u0131zdan muhakkak emin olun. <\/span><i><span style=\"font-weight: 400;\">join()<\/span><\/i><span style=\"font-weight: 400;\"> API\u2019si bu metodu \u00e7a\u011f\u0131ran thread\u2019i ilgili thread bitene kadar bekletir ve ilgili thread bitince \u00e7al\u0131\u015fmaya devam eder. E\u011fer \u00e7a\u011f\u0131ran thread\u2019in ilgili thread\u2019i beklemesini istemiyorsan\u0131z o zaman da <\/span><i><span style=\"font-weight: 400;\">detach()<\/span><\/i><span style=\"font-weight: 400;\"> API\u2019sini kullan\u0131rs\u0131n\u0131z ve bu durumda \u00e7a\u011f\u0131ran thread, arka planda \u00e7al\u0131\u015fmaya devam eder. Bu noktadan sonra, ilgili thread \u00fczerinde herhangi bir kontrol\u00fc de olmaz.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Daha detayl\u0131 bilgi i\u00e7in <span style=\"color: #008000;\"><strong><a style=\"color: #008000;\" href=\"http:\/\/www.yazilimperver.com\/index.php\/2018\/12\/31\/english-weekly-c-7-stdthread\/\">ilk thread yaz\u0131ma<\/a><\/strong><\/span> g\u00f6z atabilirsiniz.<\/span><\/p>\n<h2><span style=\"color: #0000ff;\"><b>7. Daha \u00f6nce detach() ile ayr\u0131lm\u0131\u015f bir thread i\u00e7in join() API\u2019sini \u00e7a\u011f\u0131rma<\/b><\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Bir \u00f6nceki ba\u015fl\u0131kta da ifade etti\u011fimiz gibi, daha \u00f6nce <em>detach()<\/em> ile ayr\u0131lm\u0131\u015f olan bir thread \u00fczerinde art\u0131k herhangi bir kontrol\u00fcn\u00fcz kalm\u0131yor. Bir \u015fekilde e\u011fer bu thread\u2019e ili\u015fkin olarak <em>join()<\/em> \u00e7a\u011f\u0131r\u0131rsan\u0131z (tabi normal \u015fartlarda bunu \u00e7a\u011f\u0131rmazs\u0131n\u0131z, fakat e\u011fer ilgili kodlar farkl\u0131 yerlerde ise g\u00f6z\u00fcn\u00fczden ka\u00e7abilir), uygulaman\u0131z \u00e7\u00f6ker. Peki ne yapaca\u011f\u0131z? Bu durum i\u00e7in thread k\u00fct\u00fcphanesi bir API sunmakta: <strong><em>joinable()<\/em><\/strong>. E\u011fer thread data \u00f6nce ayr\u0131lm\u0131\u015f ise, bu API false d\u00f6necektir, aksi takdirde true d\u00f6necektir.<\/span><\/p>\n<h2><span style=\"color: #0000ff;\"><strong>8. join() API\u2019sinin davran\u0131\u015f\u0131<\/strong><\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Bir \u00f6nceki API ile ilintili olarak, e\u011fer \u00e7al\u0131\u015fan bir thread\u2019e ili\u015fkin <em>join()<\/em> API\u2019sini \u00e7a\u011f\u0131r\u0131rsan\u0131z, ilgili API mevcut thread ko\u015fumunu, \u00e7a\u011fr\u0131lan thread tamamlanana kadar bloklar. Bu sebeple, bu API\u2019den \u00f6nce ya ilgili thread\u2019in i\u015finin bitti\u011finden emin olun ya da yaz\u0131l\u0131m\u0131n\u0131z\u0131 bu do\u011frultuda tasarlay\u0131n.<\/span><\/p>\n<h2><span style=\"color: #0000ff;\"><b>9. Thread arg\u00fcmanlar\u0131n\u0131n referans olarak ge\u00e7irildi\u011fini d\u00fc\u015f\u00fcnmek<\/b><\/span><\/h2>\n<p><span style=\"font-weight: 400;\"><span style=\"color: #008000;\"><strong><a style=\"color: #008000;\" href=\"http:\/\/www.yazilimperver.com\/index.php\/2018\/12\/31\/english-weekly-c-7-stdthread\/\">\u0130lk thread yaz\u0131mda<\/a><\/strong><\/span> bir \u00f6rnek \u00fczerinden g\u00f6sterdi\u011fim bir durumdu bu. Ne demi\u015ftik bakal\u0131m: <\/span><\/p>\n<p><span style=\"font-weight: 400;\">Her ne kadar, thread metodu parametreyi referans olarak al\u0131yor olsa da, yeni thread olu\u015fturulurken ilgili de\u011fi\u015fkeni arka tarafta kopyalan\u0131r ve thread \u00e7al\u0131\u015fmaya ba\u015flad\u0131\u011f\u0131nda da bu kopyay\u0131 metoda ge\u00e7irir. Bu sebeple, yeni olu\u015fturulan thread \u00e7al\u0131\u015fmay\u0131 tamamland\u0131\u011f\u0131nda, thread metodundaki de\u011fi\u015fken, thread metoduna ge\u00e7irilen ve kopyalar\u0131 olu\u015fturulan di\u011fer parametreler ile birlikte yok edilir. Bu sebeple de as\u0131l de\u011fi\u015fken g\u00fcncellenmez. Bu problemi \u00f6nlemek ve parametrenin kendisini i\u00e7eren bir referans g\u00f6ndermek i\u00e7in yine STL taraf\u0131ndan sunulan <em>std::ref()<\/em> fonksiyonu kullan\u0131lmal\u0131d\u0131r. Nas\u0131l kullanaca\u011f\u0131z? A\u015fa\u011f\u0131daki gibi:<\/span><\/p>\n<pre class=\"lang:c++ decode:true\">\/\/ Thread'e 'str' de\u011fi\u015fkeninin referans\u0131n\u0131 ge\u00e7irmek istiyoruz\r\nstd::thread newThread(execute, std::ref(str));<\/pre>\n<h2><b style=\"color: #0000ff;\">10. std::atomic tipinin kullan\u0131m\u0131<\/b><\/h2>\n<p><span style=\"font-weight: 400;\"><span style=\"color: #008000;\"><strong><a style=\"color: #008000;\" href=\"http:\/\/www.yazilimperver.com\/index.php\/2019\/01\/28\/english-weekly-c-8-stdthread-ii\/\">\u0130kinci thread yaz\u0131mda<\/a> <\/strong><\/span>bahsetti\u011fim gibi, temel ve basit veri tipleri i\u00e7in <em>std::atomic<\/em> mekanizmas\u0131n\u0131 kullanabiliriz. Bu bize hem performans hem de okunabilirlik ad\u0131na bir\u00e7ok fayda sa\u011flar. <em>std::mutex<\/em> kullanabilir miyiz? Elbette, ama atomic kullan\u0131m\u0131 bizim i\u00e7in performans a\u00e7\u0131s\u0131ndan ciddi fark yaratabilir. <\/span><strong><span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"https:\/\/www.arangodb.com\/2015\/02\/comparing-atomic-mutex-rwlocks\/\">https:\/\/www.arangodb.com\/2015\/02\/comparing-atomic-mutex-rwlocks\/<\/a><\/span><\/strong><span style=\"font-weight: 400;\"> sitesinde bunun ile ilgili g\u00fczel bir \u00e7al\u0131\u015fma var.<\/span><\/p>\n<h2><span style=\"color: #0000ff;\"><b>11. std::future nesnesine ili\u015fkin get() API\u2019sinin bilin\u00e7siz bir \u015fekilde \u00e7a\u011fr\u0131lmas\u0131<\/b><\/span><\/h2>\n<p><span style=\"font-weight: 400;\">\u015eimdi de eski yaz\u0131lar\u0131mda bahsetti\u011fim bir s\u0131n\u0131f olan, <em>std::future<\/em> nesnesine ili\u015fkin bir duruma g\u00f6z atal\u0131m. O yaz\u0131mda da bahsetti\u011fim gibi, e\u011fer bu nesnenin i\u015fi hen\u00fcz bitmemi\u015f ise ve <em>get()<\/em> metodu \u00e7a\u011fr\u0131l\u0131rsa, ilgili i\u015f bitene kadar, mevcut thread bloklan\u0131r ki bunu genelde istemeyiz. Hemen bir \u00f6rnek \u00fczerinden bu duruma bakal\u0131m:<\/span><\/p>\n<pre class=\"lang:c++ decode:true\">#include &lt;future&gt;\r\n#include &lt;iostream&gt;\r\n\r\nint main()\r\n{\r\n  std::future&lt;int&gt; myFuture = std::async(std::launch::async, []()\r\n  {\r\n    std::this_thread::sleep_for(std::chrono::seconds(10));\r\n    return 8;\r\n  });\r\n  \r\n  \/\/ veri i\u015fleme d\u00f6ng\u00fcs\u00fc\r\n  while (true)\r\n  {\r\n    \/\/ Konsola bir seyler bastiralim \r\n    std::cout &lt;&lt; \"Processing Data\" &lt;&lt; std::endl;\r\n    \r\n     \/\/ Bu kod 10 sn mevcut threadi bloklar\r\n    int val = myFuture.get(); \r\n  }\r\n  return 0;\r\n}<\/pre>\n<p><span style=\"font-weight: 400;\">Yukar\u0131da verilen kodta, nerede bloklama olaca\u011f\u0131n\u0131 g\u00f6rebilirsiniz. Bu kod ile ilgili bir di\u011fer s\u0131k\u0131nt\u0131 da, ilgili <em>std::future<\/em> nesnesi bir kere al\u0131n\u0131p, art\u0131k al\u0131nacak bir \u015fey olmamas\u0131na ra\u011fmen, bunun sorgulanmas\u0131d\u0131r.Bunu \u00f6nlemek i\u00e7in, ilgili nesnenin haz\u0131r olur olmad\u0131\u011f\u0131n\u0131 kontrol edebiliriz. Bunu da <em>valid()<\/em> API si ile yapabiliriz. \u015e\u00f6yleki:<\/span><\/p>\n<pre class=\"lang:c++ decode:true\">#include &lt;future&gt;\r\n#include &lt;iostream&gt;\r\n\r\nint main()\r\n{\r\n  std::future&lt;int&gt; myFuture = std::async(std::launch::async, []()\r\n  {\r\n    std::this_thread::sleep_for(std::chrono::seconds(10));\r\n    return 8;\r\n  });\r\n  \r\n  \/\/ \u0130\u015flem yapan d\u00f6ng\u00fc\r\n  while (true)\r\n  {\r\n    \/\/ Konsola bir seyler bastiralim\r\n    std::cout &lt;&lt; \"Veri i\u015fleniyor\" &lt;&lt; std::endl;\r\n\r\n    if (myFuture.valid())\r\n    {\r\n       \/\/ mevcut thread 10 sn bekleyecek\r\n      int val = myFuture.get();\r\n    }\r\n  }\r\n  return 0;\r\n}<\/pre>\n<h2><span style=\"color: #0000ff;\"><b>12. std::async i\u00e7erisinde ger\u00e7ekle\u015fen istisna (exception) durumlar\u0131 std::future nesnesine get() API\u2019si ile ge\u00e7irilmesi<\/b><\/span><\/h2>\n<p><span style=\"font-weight: 400;\"> E\u011fer <em>std::async<\/em> kullan\u0131yorsan\u0131z ve bunun i\u00e7erisinde bir istisnai durum olu\u015ftu ise bunu \u00e7a\u011f\u0131ran tarafa ge\u00e7irmek i\u00e7in de <em>get()<\/em> API\u2019sini \u00e7a\u011f\u0131rmal\u0131s\u0131n\u0131z. A\u015fa\u011f\u0131da buna dair \u00f6rnek bir kullan\u0131m g\u00f6sterelim:<\/span><\/p>\n<pre class=\"lang:c++ decode:true\">#include &lt;future&gt;\r\n#include &lt;iostream&gt;\r\n\r\nint main()\r\n{\r\n   std::future&lt;int&gt; myFuture = std::async(std::launch::async, []() \r\n   {\r\n        throw std::runtime_error(\"Catch me in MAIN\");\r\n        return 8;\r\n    });\r\n\r\n    if (myFuture.valid())\r\n    {\r\n        try\r\n        {\r\n            int result = myFuture.get();\r\n        }\r\n        catch (const std::runtime_error&amp; e)\r\n        {\r\n            std::cout &lt;&lt; \"Async task threw exception: \" &lt;&lt; e.what() &lt;&lt; std::endl;\r\n        }\r\n    }\r\n   \r\n   return 0;\r\n}<\/pre>\n<h2><span style=\"color: #0000ff;\"><b>13. Mevcut \u00e7ekirdek say\u0131s\u0131nda \u00e7ok daha fazla thread olu\u015fturulmas\u0131<\/b><\/span><\/h2>\n<p><span style=\"font-weight: 400;\"><span style=\"color: #008000;\"><strong><a style=\"color: #008000;\" href=\"http:\/\/www.yazilimperver.com\/index.php\/2018\/12\/31\/english-weekly-c-7-stdthread\/\">\u0130lk thread yaz\u0131mda<\/a><\/strong><\/span> da bahsetti\u011fimiz gibi, ayn\u0131 anda \u00e7al\u0131\u015fabilecek thread say\u0131s\u0131, mevcut i\u015flemcinin bizlere sundu\u011fu \u00e7ekirdek say\u0131s\u0131 ile ilintilidir. E\u011fer ilgili thread say\u0131s\u0131 bundan fazla ise, fazladan thread olu\u015fturmak, bize performans anlam\u0131nda ciddi bir kazan\u0131m sa\u011flamaz, hatta k\u00f6t\u00fc y\u00f6nde de etkileyebilir.<\/span><\/p>\n<p>Evet arkada\u015flar, bir yaz\u0131m\u0131z\u0131n daha sonuna geldik. Umar\u0131m thread&#8217;ler konusunda sizlere yard\u0131mc\u0131 olacak bir kaynak olmu\u015ftur. Buradaki konular\u0131n yan\u0131nda, daha detayl\u0131 bilgi i\u00e7in a\u015fa\u011f\u0131daki sitelere de g\u00f6z atmay\u0131 unutmay\u0131n. Bir sonraki yaz\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere.<\/p>\n<h2><span style=\"color: #0000ff;\"><strong>Kaynaklar:<\/strong><\/span><\/h2>\n<ul>\n<li><span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"https:\/\/austingwalters.com\/multithreading-common-pitfalls\/\"><strong>https:\/\/austingwalters.com\/multithreading-common-pitfalls\/<\/strong><\/a><\/span><\/li>\n<li><strong><span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"https:\/\/www.acodersjourney.com\/top-20-cplusplus-multithreading-mistakes\/\">https:\/\/www.acodersjourney.com\/top-20-cplusplus-multithreading-mistakes\/<\/a><\/span><\/strong><\/li>\n<li><strong><a href=\"http:\/\/www.drdobbs.com\/tools\/avoiding-classic-threading-problems\/231000499\"><span style=\"color: #008000;\">http:\/\/www.drdobbs.com\/tools\/avoiding-classic-threading-problems\/231000499<\/span><\/a><\/strong><\/li>\n<\/ul>\n<p><\/p>","protected":false},"excerpt":{"rendered":"<p>Merhabalar dostlar. K\u0131sa bir aradan sonra, ba\u015fka bir haftal\u0131k C++ yaz\u0131s\u0131 ile birlikteyiz. Bu yaz\u0131mda, bir s\u00fcre \u00f6nce sizler ile payla\u015ft\u0131\u011f\u0131m thread k\u00fct\u00fcphanesinin kullan\u0131m\u0131 ile ilgili baz\u0131 hatal durumlar\u0131 ve bunlar\u0131 nas\u0131l \u00f6nleyebilece\u011fimize bakaca\u011f\u0131z. Her bir duruma ayr\u0131 ba\u015fl\u0131klarda, k\u0131sa a\u00e7\u0131klama ve \u00f6rnekler ile de\u011finece\u011fiz. Buradaki durumlar\u0131n bir k\u0131sm\u0131n\u0131, yaz\u0131lar\u0131m\u0131 takip edenleriniz hat\u0131rlayacakt\u0131r, ilgili konular\u0131&#8230; <a class=\"more-link\" href=\"https:\/\/www.yazilimperver.com\/index.php\/2019\/03\/30\/haftalik-c-12-multithread-programlamada-karsilasilan-bazi-sikintilar\/\">Continue reading <span class=\"meta-nav\">&#8594;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":174,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[10,41],"tags":[13,292,370,392,393,291],"class_list":["post-864","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-c","category-modern-c","tag-c","tag-multithreaded-programming","tag-mutex","tag-pitfalls","tag-stdthread","tag-thread"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v21.0 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Haftal\u0131k C++ 12 - Multithread programlamada kar\u015f\u0131la\u015f\u0131lan baz\u0131 s\u0131k\u0131nt\u0131lar - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.yazilimperver.com\/index.php\/2019\/03\/30\/haftalik-c-12-multithread-programlamada-karsilasilan-bazi-sikintilar\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"[:tr]Haftal\u0131k C++ 12 - Multithread programlamada kar\u015f\u0131la\u015f\u0131lan baz\u0131 s\u0131k\u0131nt\u0131lar[:en]Weekly C++ 12 - Multithreaded programming issues[:] - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\" \/>\n<meta property=\"og:description\" content=\"Merhabalar dostlar. K\u0131sa bir aradan sonra, ba\u015fka bir haftal\u0131k C++ yaz\u0131s\u0131 ile birlikteyiz. Bu yaz\u0131mda, bir s\u00fcre \u00f6nce sizler ile payla\u015ft\u0131\u011f\u0131m thread k\u00fct\u00fcphanesinin kullan\u0131m\u0131 ile ilgili baz\u0131 hatal durumlar\u0131 ve bunlar\u0131 nas\u0131l \u00f6nleyebilece\u011fimize bakaca\u011f\u0131z. Her bir duruma ayr\u0131 ba\u015fl\u0131klarda, k\u0131sa a\u00e7\u0131klama ve \u00f6rnekler ile de\u011finece\u011fiz. Buradaki durumlar\u0131n bir k\u0131sm\u0131n\u0131, yaz\u0131lar\u0131m\u0131 takip edenleriniz hat\u0131rlayacakt\u0131r, ilgili konular\u0131... Continue reading &#8594;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.yazilimperver.com\/index.php\/2019\/03\/30\/haftalik-c-12-multithread-programlamada-karsilasilan-bazi-sikintilar\/\" \/>\n<meta property=\"og:site_name\" content=\"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2019-03-30T12:51:45+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2019-03-30T17:58:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2017\/12\/FeaturedImage-e1580417052514.png\" \/>\n\t<meta property=\"og:image:width\" content=\"32\" \/>\n\t<meta property=\"og:image:height\" content=\"32\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"yaz\u0131l\u0131mperver\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"yaz\u0131l\u0131mperver\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"13 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2019\/03\/30\/haftalik-c-12-multithread-programlamada-karsilasilan-bazi-sikintilar\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2019\/03\/30\/haftalik-c-12-multithread-programlamada-karsilasilan-bazi-sikintilar\/\"},\"author\":{\"name\":\"yaz\u0131l\u0131mperver\",\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\"},\"headline\":\"Haftal\u0131k C++ 12 &#8211; Multithread programlamada kar\u015f\u0131la\u015f\u0131lan baz\u0131 s\u0131k\u0131nt\u0131lar\",\"datePublished\":\"2019-03-30T12:51:45+00:00\",\"dateModified\":\"2019-03-30T17:58:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2019\/03\/30\/haftalik-c-12-multithread-programlamada-karsilasilan-bazi-sikintilar\/\"},\"wordCount\":2244,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\"},\"keywords\":[\"c++\",\"multithreaded programming\",\"mutex\",\"pitfalls\",\"std::thread\",\"thread\"],\"articleSection\":[\"C++\",\"Modern C++\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.yazilimperver.com\/index.php\/2019\/03\/30\/haftalik-c-12-multithread-programlamada-karsilasilan-bazi-sikintilar\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2019\/03\/30\/haftalik-c-12-multithread-programlamada-karsilasilan-bazi-sikintilar\/\",\"url\":\"https:\/\/www.yazilimperver.com\/index.php\/2019\/03\/30\/haftalik-c-12-multithread-programlamada-karsilasilan-bazi-sikintilar\/\",\"name\":\"[:tr]Haftal\u0131k C++ 12 - Multithread programlamada kar\u015f\u0131la\u015f\u0131lan baz\u0131 s\u0131k\u0131nt\u0131lar[:en]Weekly C++ 12 - Multithreaded programming issues[:] - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#website\"},\"datePublished\":\"2019-03-30T12:51:45+00:00\",\"dateModified\":\"2019-03-30T17:58:00+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2019\/03\/30\/haftalik-c-12-multithread-programlamada-karsilasilan-bazi-sikintilar\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.yazilimperver.com\/index.php\/2019\/03\/30\/haftalik-c-12-multithread-programlamada-karsilasilan-bazi-sikintilar\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2019\/03\/30\/haftalik-c-12-multithread-programlamada-karsilasilan-bazi-sikintilar\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Ana sayfa\",\"item\":\"https:\/\/www.yazilimperver.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Haftal\u0131k C++ 12 &#8211; Multithread programlamada kar\u015f\u0131la\u015f\u0131lan baz\u0131 s\u0131k\u0131nt\u0131lar\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.yazilimperver.com\/#website\",\"url\":\"https:\/\/www.yazilimperver.com\/\",\"name\":\"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\",\"description\":\"Payla\u015fmak g\u00fczeldir.\",\"publisher\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.yazilimperver.com\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\",\"name\":\"yaz\u0131l\u0131mperver\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/04\/OnlyIcon-1-114x114.png\",\"contentUrl\":\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/04\/OnlyIcon-1-114x114.png\",\"caption\":\"yaz\u0131l\u0131mperver\"},\"logo\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"[:tr]Haftal\u0131k C++ 12 - Multithread programlamada kar\u015f\u0131la\u015f\u0131lan baz\u0131 s\u0131k\u0131nt\u0131lar[:en]Weekly C++ 12 - Multithreaded programming issues[:] - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.yazilimperver.com\/index.php\/2019\/03\/30\/haftalik-c-12-multithread-programlamada-karsilasilan-bazi-sikintilar\/","og_locale":"tr_TR","og_type":"article","og_title":"[:tr]Haftal\u0131k C++ 12 - Multithread programlamada kar\u015f\u0131la\u015f\u0131lan baz\u0131 s\u0131k\u0131nt\u0131lar[:en]Weekly C++ 12 - Multithreaded programming issues[:] - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","og_description":"Merhabalar dostlar. K\u0131sa bir aradan sonra, ba\u015fka bir haftal\u0131k C++ yaz\u0131s\u0131 ile birlikteyiz. Bu yaz\u0131mda, bir s\u00fcre \u00f6nce sizler ile payla\u015ft\u0131\u011f\u0131m thread k\u00fct\u00fcphanesinin kullan\u0131m\u0131 ile ilgili baz\u0131 hatal durumlar\u0131 ve bunlar\u0131 nas\u0131l \u00f6nleyebilece\u011fimize bakaca\u011f\u0131z. Her bir duruma ayr\u0131 ba\u015fl\u0131klarda, k\u0131sa a\u00e7\u0131klama ve \u00f6rnekler ile de\u011finece\u011fiz. Buradaki durumlar\u0131n bir k\u0131sm\u0131n\u0131, yaz\u0131lar\u0131m\u0131 takip edenleriniz hat\u0131rlayacakt\u0131r, ilgili konular\u0131... Continue reading &#8594;","og_url":"https:\/\/www.yazilimperver.com\/index.php\/2019\/03\/30\/haftalik-c-12-multithread-programlamada-karsilasilan-bazi-sikintilar\/","og_site_name":"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","article_published_time":"2019-03-30T12:51:45+00:00","article_modified_time":"2019-03-30T17:58:00+00:00","og_image":[{"width":32,"height":32,"url":"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2017\/12\/FeaturedImage-e1580417052514.png","type":"image\/png"}],"author":"yaz\u0131l\u0131mperver","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"yaz\u0131l\u0131mperver","Tahmini okuma s\u00fcresi":"13 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.yazilimperver.com\/index.php\/2019\/03\/30\/haftalik-c-12-multithread-programlamada-karsilasilan-bazi-sikintilar\/#article","isPartOf":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2019\/03\/30\/haftalik-c-12-multithread-programlamada-karsilasilan-bazi-sikintilar\/"},"author":{"name":"yaz\u0131l\u0131mperver","@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb"},"headline":"Haftal\u0131k C++ 12 &#8211; Multithread programlamada kar\u015f\u0131la\u015f\u0131lan baz\u0131 s\u0131k\u0131nt\u0131lar","datePublished":"2019-03-30T12:51:45+00:00","dateModified":"2019-03-30T17:58:00+00:00","mainEntityOfPage":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2019\/03\/30\/haftalik-c-12-multithread-programlamada-karsilasilan-bazi-sikintilar\/"},"wordCount":2244,"commentCount":0,"publisher":{"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb"},"keywords":["c++","multithreaded programming","mutex","pitfalls","std::thread","thread"],"articleSection":["C++","Modern C++"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.yazilimperver.com\/index.php\/2019\/03\/30\/haftalik-c-12-multithread-programlamada-karsilasilan-bazi-sikintilar\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.yazilimperver.com\/index.php\/2019\/03\/30\/haftalik-c-12-multithread-programlamada-karsilasilan-bazi-sikintilar\/","url":"https:\/\/www.yazilimperver.com\/index.php\/2019\/03\/30\/haftalik-c-12-multithread-programlamada-karsilasilan-bazi-sikintilar\/","name":"[:tr]Haftal\u0131k C++ 12 - Multithread programlamada kar\u015f\u0131la\u015f\u0131lan baz\u0131 s\u0131k\u0131nt\u0131lar[:en]Weekly C++ 12 - Multithreaded programming issues[:] - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/www.yazilimperver.com\/#website"},"datePublished":"2019-03-30T12:51:45+00:00","dateModified":"2019-03-30T17:58:00+00:00","breadcrumb":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2019\/03\/30\/haftalik-c-12-multithread-programlamada-karsilasilan-bazi-sikintilar\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.yazilimperver.com\/index.php\/2019\/03\/30\/haftalik-c-12-multithread-programlamada-karsilasilan-bazi-sikintilar\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.yazilimperver.com\/index.php\/2019\/03\/30\/haftalik-c-12-multithread-programlamada-karsilasilan-bazi-sikintilar\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Ana sayfa","item":"https:\/\/www.yazilimperver.com\/"},{"@type":"ListItem","position":2,"name":"Haftal\u0131k C++ 12 &#8211; Multithread programlamada kar\u015f\u0131la\u015f\u0131lan baz\u0131 s\u0131k\u0131nt\u0131lar"}]},{"@type":"WebSite","@id":"https:\/\/www.yazilimperver.com\/#website","url":"https:\/\/www.yazilimperver.com\/","name":"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","description":"Payla\u015fmak g\u00fczeldir.","publisher":{"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.yazilimperver.com\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb","name":"yaz\u0131l\u0131mperver","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/","url":"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/04\/OnlyIcon-1-114x114.png","contentUrl":"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/04\/OnlyIcon-1-114x114.png","caption":"yaz\u0131l\u0131mperver"},"logo":{"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/864","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/comments?post=864"}],"version-history":[{"count":9,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/864\/revisions"}],"predecessor-version":[{"id":1093,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/864\/revisions\/1093"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/media\/174"}],"wp:attachment":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/media?parent=864"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/categories?post=864"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/tags?post=864"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}