{"id":776,"date":"2018-12-31T13:32:58","date_gmt":"2018-12-31T13:32:58","guid":{"rendered":"http:\/\/www.yazilimperver.com\/?p=776"},"modified":"2019-03-08T19:44:48","modified_gmt":"2019-03-08T19:44:48","slug":"english-weekly-c-7-stdthread","status":"publish","type":"post","link":"https:\/\/www.yazilimperver.com\/index.php\/2018\/12\/31\/english-weekly-c-7-stdthread\/","title":{"rendered":"Haftal\u0131k C++ 7- std::thread (I)"},"content":{"rendered":"<p>Bir ba\u015fka haftal\u0131k C++ yaz\u0131s\u0131 ile tekrar beraberiz. Bu yaz\u0131mda, sizlere C++ 11 ile birlikte sunulmaya ba\u015flanan bir k\u00fct\u00fcphane bilgi aktaraca\u011f\u0131m. Bu k\u00fct\u00fcphaneden daha \u00f6nce tamamlad\u0131\u011f\u0131m Modern C++ yaz\u0131lar\u0131mda bahsetmemi\u015ftim (neden diye sormay\u0131n), ama art\u0131k vakti geldi. Eminim geli\u015ftirdi\u011finiz programlarda, \u00f6zellikle \u00e7oklu \u00e7ekirde\u011fe sahip i\u015flemciler i\u00e7in :), bir noktada buna ihtiyac\u0131n\u0131z olmu\u015ftur.\u00a0 Evet, tahmin edebilece\u011finiz \u00fczere bu k\u00fct\u00fcphane <em>thread<\/em> k\u00fct\u00fcphanesi. \u00c7oklu \u00e7ekirdekli i\u015flemcilerin yayg\u0131nla\u015fmas\u0131 ile birlikte, multithreaded (\u00e7ok fazla kafa kar\u0131\u015ft\u0131rmamak ad\u0131na bu \u015fekilde kullanaca\u011f\u0131m) uygulama geli\u015ftirme art\u0131k \u00f6nemli bir kabiliyet haline geldi. Uzun bir s\u00fcre, C++ programlama dilini kullanarak multithreaded yaz\u0131l\u0131m geli\u015ftirmek i\u00e7in platform ba\u011f\u0131ml\u0131 Win32 soketleri, MFC soketleri, PThreads ve benzeri API&#8217;leri kullanmak zorunda kal\u0131yorduk (e\u011fer tabi Boost ya da POCO kullanm\u0131yor iseniz). C++ 11&#8217;den \u00f6nce nas\u0131l multithreaded yaz\u0131l\u0131m geli\u015ftirildi\u011fini merak ediyorsan\u0131z, <span style=\"color: #339966;\"><strong><a style=\"color: #339966;\" href=\"https:\/\/www.tutorialspoint.com\/cplusplus\/cpp_multithreading.htm\">\u015fu ba\u011flant\u0131daki yaz\u0131ya<\/a><\/strong> <\/span>bir g\u00f6z atabilirsiniz.<\/p>\n<p>Seriye ili\u015fkin yaz\u0131lara a\u015fa\u011f\u0131daki ba\u011flant\u0131lardan ula\u015fabilirsiniz:<\/p>\n<p><strong><span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"http:\/\/www.yazilimperver.com\/index.php\/2018\/12\/31\/english-weekly-c-7-stdthread\/\">Haftal\u0131k C++ 7- std::thread (I)<\/a><\/span><\/strong><\/p>\n<p><strong><span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"http:\/\/www.yazilimperver.com\/index.php\/2019\/01\/28\/english-weekly-c-8-stdthread-ii\/\">Haftal\u0131k C++ 8- std::thread (II)<\/a><\/span><\/strong><\/p>\n<p><strong><span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"http:\/\/www.yazilimperver.com\/index.php\/2019\/03\/08\/haftalik-c-10-stdthread-iii\/\">Haftal\u0131k C++ 10- std::thread (III)<\/a><\/span><\/strong><\/p>\n<h2><strong><span style=\"color: #0000ff;\">Giri\u015f:<\/span><\/strong><\/h2>\n<p>C++ 11 ile birlikte, STL ile sunulan Thread k\u00fct\u00fcphanesini kullanarak, \u00e7oklu platform i\u00e7in, standard bir \u015fekilde multihreaded yaz\u0131l\u0131m geli\u015ftirebiliyoruz. E\u011fer daha \u00f6nce bir \u015fekilde,\u00a0<span style=\"color: #008000;\"><strong><a style=\"color: #008000;\" href=\"https:\/\/www.boost.org\/doc\/libs\/1_69_0\/doc\/html\/thread.html\">Boost Thread library<\/a><\/strong><\/span>\u00a0kullanarak multithreaded yaz\u0131l\u0131m geli\u015ftirdiyseniz, C++ 11 ile k\u00fct\u00fcphanesinin de, b\u00fcy\u00fck \u00f6l\u00e7\u00fcde bu k\u00fct\u00fcphaneye dayand\u0131\u011f\u0131n\u0131 bilmek sizi sevindirecektir. Tabi burada \u00f6zel olarak, sizi Boost ya da ba\u015fka bir k\u00fct\u00fcphaneyi kullanmaya sizi zorlayan bir neden yok ise STL ile sunulan <strong><span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"https:\/\/en.cppreference.com\/w\/cpp\/thread\/thread\">std::thread<\/a>\u00a0<\/span><\/strong>k\u00fct\u00fcphanesini kullanmal\u0131s\u0131n\u0131z.<\/p>\n<p>Yaz\u0131m\u0131n devam\u0131nda, multithreaded yaz\u0131l\u0131m geli\u015ftirmenize yard\u0131mc\u0131 olacak baz\u0131 thread ve benzeri kavramlara ili\u015fkin bilgi aktaraca\u011f\u0131m. Sonras\u0131nda ise di\u011fer yaz\u0131lar\u0131mda oldu\u011fu gibi \u00f6nemli kabiliyetleri \u00f6rnek kodlar \u00fczerinden sizlere aktaraca\u011f\u0131m. Tabi k\u00fct\u00fcphane olduk\u00e7a b\u00fcy\u00fck, bu yaz\u0131larda b\u00fct\u00fcn ince ayr\u0131nt\u0131lar\u0131n \u00fczerinden ge\u00e7mek imkans\u0131z. Hatta bu yaz\u0131mda sadece temel thread API&#8217;lerinden bahsedip, ba\u015fka bir yaz\u0131mda yard\u0131mc\u0131 yap\u0131lardan bahsetmeyi planl\u0131yorum. E\u011fer, bu konu ile ilgili a\u00e7\u0131kta bir husus kald\u0131\u011f\u0131n\u0131 d\u00fc\u015f\u00fcn\u00fcyor iseniz bir sonraki yaz\u0131da olabilir, ya da hi\u00e7 beklemeden direk sorabilirsiniz. Hadi ba\u015flayal\u0131m.<\/p>\n<h2><strong><span style=\"color: #0000ff;\">Thread&#8217;lere giri\u015f:<\/span><\/strong><\/h2>\n<p>Bildi\u011finiz \u00fczere, haftal\u0131k C++ yaz\u0131lar\u0131mda olabildi\u011fince detaylara girmemeye gayret ediyorum \ud83d\ude42 ama bu sefer de, bir istisna yapal\u0131m ve threadler nedir sorusuna bir g\u00f6z atal\u0131m. Bu konuya ili\u015fkin ger\u00e7ek anlamda detayl\u0131 bir bilgi almak istiyorsan\u0131z, nadide ders kitaplar\u0131m\u0131zdan olan <span style=\"color: #008000;\"><strong><a style=\"color: #008000;\" href=\"https:\/\/www.amazon.com\/Modern-Operating-Systems-Andrew-Tanenbaum\/dp\/013359162X\">Tanenbaum&#8217;s Modern Operating Systems book<\/a>\u00a0<\/strong><\/span>kitab\u0131n\u0131n &#8220;Processes and Threads&#8221; konusunu okuman\u0131z\u0131 \u015fiddetle tavsiye ederim, daha C++ a\u011f\u0131rl\u0131kl\u0131 bilgi i\u00e7in ise\u00a0 <span style=\"color: #008000;\"><strong><a style=\"color: #008000;\" href=\"https:\/\/www.amazon.com\/C-Concurrency-Action-Anthony-Williams\/dp\/1617294691\/ref=pd_lpo_sbs_14_img_0?_encoding=UTF8&amp;psc=1&amp;refRID=ZXET66SHQDZSWECSTNBQ\">Anthony Williams C++ Concurreny in Action books<\/a>\u00a0<\/strong><\/span>kitab\u0131na bir g\u00f6z atabilirsiniz. Ben bu ba\u015fl\u0131k alt\u0131nda, verdi\u011fim kaynaklarda detaylar\u0131 anlat\u0131lan konulara ili\u015fkin \u00f6zet bilgi ge\u00e7ece\u011fim.<\/p>\n<p>\u00d6ncelikli olarak threadleri (i\u015f par\u00e7ac\u0131\u011f\u0131) daha iyi anlayabilmek i\u00e7in programlara, i\u015flemlere (<strong>process<\/strong>) ve bunlar\u0131n birbirleri ile olan ili\u015fkilerine bakmam\u0131z gerekiyor. \u00a0<strong>Programlar<\/strong>, \u00e7e\u015fitli C++ benzeri programlama dilleri ile geli\u015ftirilmi\u015f olan kodlar\u0131n derlenip, ba\u011flanmas\u0131 ile elde edilen ikili sisteme uygun saklanan (<em>binary<\/em>) dosyalard\u0131r (Python ve benzeri dillerde ise ilgili kaynak kod \u00e7al\u0131\u015fma zaman\u0131nda ilgili platforma g\u00f6re yorumlan\u0131r. Bu dosyalar, \u00e7al\u0131\u015ft\u0131r\u0131lmak amac\u0131 ile belle\u011fe al\u0131nana kadar, dosya sisteminde saklan\u0131rlar.<br \/>\nBu program belle\u011fe y\u00fcklendikten sonra, kabaca ilgili b\u00fct\u00fcn kaynaklar ile birlikte <strong>i\u015flem\u00a0(Process)<\/strong> halini al\u0131r. Bu i\u015flemler, belle\u011fe y\u00fcklendikten sonra ilgili i\u015fletim sistemi taraf\u0131ndan y\u00f6netilirler ve her i\u015fletim sistemine \u00f6zg\u00fc ek parametre veya kaynaklara sahip olabilirler ama genel olarak \u00e7o\u011fu i\u015fletim sistemi bu i\u015flemlere dair a\u015fa\u011f\u0131da verilen bilgileri tutar:<\/p>\n<ul>\n<li><strong>Program\/Y\u00f6nerge Sayac\u0131 (Program\/Instruction counter)<\/strong>: \u00c7al\u0131\u015ft\u0131r\u0131lan uygulamada i\u015flemcinin \u015fu i\u015feyece\u011fi y\u00f6nergeyi g\u00f6steren saya\u00e7,<\/li>\n<li><strong>Kay\u0131t Alanlar\u0131<\/strong> (<strong>Registers)<\/strong>: CPU \u00fczerinde bulunan veri slotlar\u0131,<\/li>\n<li><strong>Stack<\/strong>: Mevcut aktif rutin ya da fonksiyona ili\u015fkin bilgileri tutan veri yap\u0131s\u0131. Ayr\u0131ca ge\u00e7ici veriler de burada tutulur,<\/li>\n<li><strong>Heap<\/strong>: Dinamik olarak ayr\u0131lan bellekler<\/li>\n<li><strong>Dosya\/Soket\/Sinyal Kotar\u0131c\u0131lar\u0131:<\/strong> Bu i\u015flem taraf\u0131ndan a\u00e7\u0131lan dosya, soket ve sinyal kotar\u0131c\u0131lar\u0131.<\/li>\n<\/ul>\n<p>\u00d6zellikle Stack ve Heap ile ilgili daha fazla bilgi edinmek i\u00e7in <span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"https:\/\/www.google.com\/search?safe=off&amp;rlz=1C1SQJL_trTR803TR803&amp;biw=1920&amp;bih=889&amp;ei=s1JEXLvYNcns_QaZmrugBw&amp;q=heap+ve+stack+veri+yap%C4%B1lar%C4%B1&amp;oq=heap+ve+stack+veri+yap%C4%B1lar%C4%B1&amp;gs_l=psy-ab.3..35i39.253230.253230..253502...0.0..0.185.185.0j1......0....1..gws-wiz.......0i71.uqOQPy468f4\"><strong>\u015fu sonu\u00e7lara<\/strong><\/a><\/span> bakabilirsiniz.<\/p>\n<p>Her bir <strong>i\u015flem<\/strong>, kendisine ait bellek adres uzaylar\u0131na sahiptir, di\u011fer i\u015flemlerden ba\u011f\u0131ms\u0131z ve izole bir \u015fekilde bu alan i\u00e7erisinde \u00e7al\u0131\u015f\u0131rlar. Bunlar di\u011fer i\u015flemlerin verilerine direk eri\u015femezler. Bu ba\u011f\u0131ms\u0131zl\u0131k \u00f6nemli, \u00e7\u00fcnk\u00fc herhangi bir i\u015flemde olu\u015facak bir problemin, di\u011fer i\u015flemleri etkilememesi veya bozmamas\u0131 i\u015fletim sisteminin en \u00f6nemli amac\u0131d\u0131r ve bu ba\u011f\u0131ms\u0131zl\u0131k buna hizmet eder.<\/p>\n<p>\u015eimdi thread&#8217;lere bir g\u00f6z atal\u0131m. Thread&#8217;ler, i\u015flemler i\u00e7erisindeki i\u015fleri yerine getiren birimlerdir. Bu birimler ayn\u0131 program\/i\u015flem i\u00e7erisinde di\u011fer birimlerden ba\u011f\u0131ms\u0131z bir \u015fekilde kodlar\u0131n\/y\u00f6nergelerin ko\u015fturulmas\u0131n\u0131 sa\u011flarlar.\u00a0 Baz\u0131 kaynaklarda, thread&#8217;ler hafif i\u015flem (<em>lightweight processes)\u00a0<\/em>olarak da adland\u0131r\u0131lm\u0131\u015flard\u0131r. \u00c7\u00fcnk\u00fc kendilerine ait stack&#8217;leri vard\u0131r ve bunlar di\u011fer thread&#8217;ler ile payla\u015f\u0131lmaz, yani birbirlerinin stack&#8217;lerinde bulunana verilere eri\u015femezler. Bunun ile birlikte i\u015fleme ait ve Heap&#8217;te bulunan verilere, soketlere ve dosya kotar\u0131c\u0131lar\u0131na eri\u015febilirler. Thread&#8217;ler ayn\u0131 i\u015flem i\u00e7erisinde bulunurlar ve ilgili bellek adres uzay\u0131n\u0131 payla\u015f\u0131rlar. Bu nedenler, i\u015flemler aras\u0131 haberle\u015fmeye g\u00f6re thread&#8217;ler aras\u0131 haberle\u015fmenin maliyeti \u00e7ok daha azd\u0131r. Tabi burada, herhangi bir thread&#8217;te olu\u015facak problemin di\u011fer thread&#8217;leri ve nihayetinde i\u015flemin \u00e7al\u0131\u015fmas\u0131n\u0131 sekteye u\u011fratma riski bulunmaktad\u0131r.<\/p>\n<p>\u0130\u015flem ve i\u00e7erisindeki thread&#8217;ler aras\u0131ndaki ili\u015fki, a\u015fa\u011f\u0131daki fig\u00fcrde g\u00f6sterilmektedir. Detaylar i\u00e7in <strong><a href=\"https:\/\/randu.org\/tutorials\/threads\/images\/process.png\"><span style=\"color: #008000;\">bu kayna\u011fa<\/span><\/a><\/strong> bir g\u00f6z atabilirsiniz.<\/p>\n<p id=\"fwTqADE\"><img loading=\"lazy\" decoding=\"async\" width=\"664\" height=\"393\" class=\"alignnone size-full wp-image-779 \" src=\"http:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/12\/img_5c2761eb9c3a3.png\" alt=\"\" srcset=\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/12\/img_5c2761eb9c3a3.png 664w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/12\/img_5c2761eb9c3a3-300x178.png 300w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/12\/img_5c2761eb9c3a3-500x296.png 500w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/12\/img_5c2761eb9c3a3-150x89.png 150w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/12\/img_5c2761eb9c3a3-400x237.png 400w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/12\/img_5c2761eb9c3a3-200x118.png 200w\" sizes=\"auto, (max-width: 664px) 100vw, 664px\" \/><\/p>\n<p>\u015eimdi i\u015flem ve thread&#8217;ler aras\u0131ndaki farklara bakal\u0131m (Bilgisayar m\u00fch. \u00f6\u011frencileri OS s\u0131navlar\u0131n\u0131za belki yard\u0131mc\u0131 olur \ud83d\ude09<\/p>\n<ul>\n<li>\u0130\u015flemler, threadlere g\u00f6re daha y\u00fckl\u00fc i\u015fler i\u00e7in kullan\u0131l\u0131rlar,<\/li>\n<li>\u0130\u015flemler, di\u011fer i\u015flemler ile belleklerini payla\u015fmazlar. Thread&#8217;ler ise ayn\u0131 i\u015flemi payla\u015ft\u0131klar\u0131 thread&#8217;ler ile bir k\u0131s\u0131m belle\u011fi (heap) payla\u015f\u0131rlar,<\/li>\n<li>Thread&#8217;ler aras\u0131 haberle\u015fme, i\u015flemler aras\u0131 haberle\u015fmeden genelde daha h\u0131zl\u0131d\u0131r,<\/li>\n<li>\u0130\u015fletim sistemi a\u00e7\u0131s\u0131ndan thread y\u00f6netimi (ba\u011flam de\u011fi\u015fimi, vb.), i\u015flem y\u00f6netimine g\u00f6re daha ucuz ve kolayd\u0131r.<\/li>\n<\/ul>\n<p>Thread ya da i\u015flem kullan\u0131m\u0131 her ne kadar bu yaz\u0131m\u0131z\u0131n konusu olmasa da, yukar\u0131daki sekmeler size bu konuda bir fikir verece\u011fini umuyorum. Ayr\u0131ca, bu karar\u0131n nas\u0131l verildi\u011fine ili\u015fkin Google&#8217;dan g\u00fczel bir \u00f6rnek,\u00a0<span style=\"color: #008000;\"><strong><a style=\"color: #008000;\" href=\"https:\/\/blog.chromium.org\/2008\/09\/multi-process-architecture.html\">\u00d6rnek \u0130\u015flem\/Thread Se\u00e7im Analizi<\/a>,<\/strong><\/span> de mevcut. Bir g\u00f6z atabilirsiniz.<\/p>\n<p>\u015eimdi konumuzla ilintili olan iki kavrama daha bir g\u00f6z atal\u0131m: <strong>paralellik<\/strong> (<em>parallelism<\/em>) ve <strong>ayn\u0131 anda kullan\u0131m<\/strong> (<em>concurrency<\/em>). E\u011fer kulland\u0131\u011f\u0131n\u0131z bilgisayar\u0131n i\u015flemcisi sadece bir \u00e7ekirde\u011fe sahip ise, olu\u015fturdu\u011funuz thread&#8217;ler birbirleri ile birlikte paralel \u00e7al\u0131\u015f\u0131rlar ama ayn\u0131 anda \u00e7al\u0131\u015fmazlar. \u00c7\u00fcnk\u00fc bir \u00e7ekirdek fiziksel olarak ayn\u0131 anda sadece bir y\u00f6nergeyi i\u015fleyebilir. Bir di\u011fer ifade ile, her bir thread, \u00e7ekirde\u011fin zaman\u0131n bir k\u0131sm\u0131n\u0131 alarak y\u00f6nergeleri \u00e7al\u0131\u015ft\u0131r\u0131r, daha sonra durdurulur ve di\u011fer bir thread \u00e7al\u0131\u015fmaya devam eder. Bu benzer \u015fekilde di\u011fer threadler i\u00e7in de ayn\u0131 \u015fekilde i\u015fler ve \u00e7ekirdek zaman\u0131 aralar\u0131nda payla\u015ft\u0131r\u0131l\u0131r. Asl\u0131nda tek \u00e7ekirdek i\u00e7in ayn\u0131 anda \u00e7al\u0131\u015fma durumu yoktur. Bunun ile birlikte, e\u011fer i\u015flemciniz birden fazla \u00e7ekirde\u011fe sahip ise, i\u015fte bu durumda, ger\u00e7ek anlamda ayn\u0131 anda kullan\u0131m sa\u011flan\u0131r ve her bir \u00e7ekirdekte ayn\u0131 anda bir thread \u00e7al\u0131\u015fabilir.<\/p>\n<p>Tabi burada g\u00f6z \u00f6n\u00fcnde bulundurulmas\u0131 gereken \u00f6nemli bir nokta, sizlerin threadlerin i\u015flemci \u00fczerinde y\u00f6nergeleri \u00e7al\u0131\u015ft\u0131rma, zaman payla\u015f\u0131m\u0131 ve bunlar\u0131n \u00f6nceli\u011fi konusunda kontrol\u00fcn\u00fcz olmad\u0131\u011f\u0131d\u0131r. Bu konuda STL taraf\u0131ndan da bir y\u00f6ntem de sunulmaz. Tabi burada \u00e7e\u015fitli mutex veya benzeri \u00fcst seviye yap\u0131lar sayesinde el ile kontrolden bahsetmiyorum.<\/p>\n<p>Son olarak, bu ba\u015fl\u0131\u011f\u0131 kapatmadan \u00f6nce, multithreaded yaz\u0131l\u0131m geli\u015ftirirken g\u00f6z \u00f6n\u00fcnde bulundurman\u0131z gereken iki husustan bahsedece\u011fim:<\/p>\n<ul>\n<li>Bunlardan ilki, multithreaded programlama kullanarak \u00e7\u00f6zmeye \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131z <em>problemi do\u011fru anlaman\u0131z<\/em>. Yani problemin hangi k\u0131s\u0131mlar\u0131 paralelle\u015ftirilebilir ya da ger\u00e7ekten problem buna uygun mudur?\u00a0<strong><span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"http:\/\/lmgtfy.com\/?q=Pareto+principle\">Pareto prensibi<\/a>ne\u00a0<\/span><\/strong>dayanarak \u015funu s\u00f6yleyebiliriz ki: \u0130\u015flemcinin %90 zaman\u0131, kodun %10 k\u0131sm\u0131 i\u00e7in harcan\u0131r. Bu noktada kodun %90&#8217;n\u0131ndan ziyade, \u00e7al\u0131\u015ft\u0131r\u0131lan %10 luk k\u0131sma odaklanmal\u0131s\u0131n\u0131z.<\/li>\n<li>\u0130kinci konu ise payla\u015f\u0131lacak olan kaynaklard\u0131r. Thread&#8217;ler aras\u0131 bu kaynaklar\u0131n emniyetli bir \u015fekilde payla\u015f\u0131lmas\u0131 ve threadlerin bu kaynaklar i\u00e7in bo\u015funa beklemelerinin \u00f6n\u00fcne ge\u00e7ilmesi de\u00a0\u00f6nemli bir husustur. Bu noktada thread senkronizasyon yap\u0131lar\u0131 devreye girer ki, bir sonraki yaz\u0131m\u0131zda bu yap\u0131lara de\u011finece\u011fiz. Ama threadler aras\u0131 emniyetli veri payla\u015f\u0131m\u0131 ve y\u00f6ntemleri genelde programlama dillerinden ba\u011f\u0131ms\u0131z ortak yakla\u015f\u0131mlar ya da tasar\u0131m kal\u0131plar\u0131 ile \u00e7\u00f6z\u00fclebilmektedir. Bu konu ile ilgili bir \u00e7ok kaynak bulabilirsiniz.<\/li>\n<\/ul>\n<h2><strong><span style=\"color: #0000ff;\">Thread temelleri:<\/span><\/strong><\/h2>\n<p>Evet, art\u0131k std::thread k\u00fct\u00fcphanesinin nas\u0131l kullan\u0131laca\u011f\u0131na bakabiliriz. \u00d6ncelikli olarak thread&#8217;lere ili\u015fkin temel i\u015flere bakaca\u011f\u0131z. Bu arada bu k\u00fct\u00fcphaneyi kullanabilmek i\u00e7in ihtiya\u00e7 duyulan derleyici gereksinimleri a\u015fa\u011f\u0131daki gibidir:<\/p>\n<p><strong>Windows:<\/strong> Visual Studio 2012<\/p>\n<p><strong>Linux:<\/strong> gcc 4.8.1<\/p>\n<p>K\u00fct\u00fcphaneyi kullanmak i\u00e7in, <code>&lt;thread&gt;<\/code>\u00a0dosyas\u0131n\u0131 eklememiz gerekiyor. Basit bir \u015fekilde ana thread (her C++ uygulamas\u0131 varsay\u0131lan bir thread ile ba\u015flar) yan\u0131nda yeni bir thread olu\u015fturmak i\u00e7in, std::thread nesnesi olu\u015fturup a\u015fa\u011f\u0131daki \u00e7a\u011fr\u0131labilir elemanlardan birisi ile bu nesneyi olu\u015fturuyoruz:<\/p>\n<ul>\n<li>Statik bir \u00fcye s\u0131n\u0131f metodu ya da ba\u011f\u0131ms\u0131z metot,<\/li>\n<li>S\u0131n\u0131f metot i\u015faret\u00e7isi ve ilgili s\u0131n\u0131f nesnesi,<\/li>\n<li>Fonksiyon nesneleri,<\/li>\n<li>Lambda fonksiyonlar\u0131.<\/li>\n<\/ul>\n<p>\u0130lgili thread nesne olu\u015fturulur olu\u015fturulmaz \u00e7al\u0131\u015fmaya ba\u015flar. Bunun ile birlikte mevcut thread ile birlikte kullan\u0131labilecek <em>std::this_thread<\/em> isim uzay\u0131 (namespace) ile sunulan bir tak\u0131m yard\u0131mc\u0131 metotlar bulunmaktad\u0131r. Asl\u0131nda d\u00f6rt tane:<\/p>\n<ul>\n<li><strong>sleep_for<\/strong>(): Mevcut thread&#8217;i verilen zaman boyunca uyutur (yani i\u015flemci zaman\u0131 almaz).<\/li>\n<li><strong>get_id<\/strong>(): Mevcut thread&#8217;e ili\u015fkin kullan\u0131labilecek tan\u0131mlay\u0131c\u0131 bir say\u0131 d\u00f6ner.<\/li>\n<li><strong>yield<\/strong>(): \u00c7a\u011f\u0131ran thread i\u015flemci kullan\u0131m\u0131ndan tekrar planlanmas\u0131 amac\u0131 feragat eder, yani bekleyen di\u011fer threadlere imkan sa\u011flar.<\/li>\n<li><strong>sleep_until<\/strong>(): Mevcut thread&#8217;i verilen zaman kadar uyutur. Daha sonra ilgili thread \u00e7al\u0131\u015fmas\u0131na devam eder.<\/li>\n<\/ul>\n<p>A\u015fa\u011f\u0131daki \u00f6rnekte, ana thread&#8217;e ilaveten yukar\u0131daki y\u00f6ntemler kullan\u0131larak d\u00f6rt farkl\u0131 thread olu\u015fturuluyor. Ayr\u0131ca <em>std::this_thread<\/em> API&#8217;lerine ili\u015fkin de \u00f6rnek kod g\u00f6r\u00fclebilir:<\/p>\n<pre class=\"lang:c++ decode:true\">#include &lt;thread&gt;\r\n#include &lt;memory&gt;\r\n#include &lt;chrono&gt;\r\n#include &lt;iostream&gt;\r\n\r\nusing namespace std::chrono_literals;\r\n\r\nconstexpr int gLoopCount = 10000;\r\n\r\n\/\/\/ Thread i\u00e7in ba\u011f\u0131ms\u0131z metot kullan\u0131m\u0131\r\nvoid threadFunction()\r\n{\r\n    std::cout &lt;&lt; \"[ThreadStandaloneFuncCallback] Thread started!\" &lt;&lt; '\\n';\r\n\r\n    \/\/\/ 2 sn bekle\r\n    std::this_thread::sleep_for(2s);\r\n\r\n    for(int i = 0; i &lt; gLoopCount\/10; i++)\r\n        std::cout&lt;&lt;\"Standalone function Executing\"&lt;&lt;std::endl;\r\n    \r\n    std::cout &lt;&lt; \"[ThreadStandaloneFuncCallback] Thread completed!\" &lt;&lt; '\\n';\r\n}\r\n\r\n\/\/\/ S\u0131n\u0131f \u00fcye kullan\u0131m\u0131 i\u00e7in \u00f6rnek s\u0131n\u0131f\r\nclass Task\r\n{\r\npublic:\r\n    void execute(int count)\r\n    {\r\n        std::cout &lt;&lt; \"[ThreadMemberFuncCallback] Thread started!\" &lt;&lt; '\\n';\r\n        std::cout &lt;&lt; \"[ThreadMemberFuncCallback] Thread ID: \"&lt;&lt; std::this_thread::get_id() &lt;&lt; '\\n';\r\n\r\n        \/\/\/ 2 sn bekle\r\n        std::this_thread::sleep_for(2s);\r\n\r\n        for(int i = 0; i &lt; count; i++)\r\n            std::cout&lt;&lt;\"Member function Executing\"&lt;&lt;std::endl;\r\n    \r\n        std::cout &lt;&lt; \"[ThreadMemberFuncCallback] Thread completed!\" &lt;&lt; '\\n';\r\n    }\r\n};\r\n\r\n\/\/\/ Fonksiyon nesne kullan\u0131m\u0131 i\u00e7in \u00f6rnek s\u0131n\u0131f\r\nclass DisplayThread\r\n{\r\npublic:\r\n    void operator()()\r\n    {\r\n        std::cout &lt;&lt; \"[ThreadFunctionObjectCallback] Thread started!\" &lt;&lt; '\\n';\r\n        std::cout &lt;&lt; \"[ThreadFunctionObjectCallback] Thread ID: \"&lt;&lt; std::this_thread::get_id() &lt;&lt; '\\n';\r\n\r\n        \/\/\/ 2 sn bekle\r\n        std::this_thread::sleep_for(2s);\r\n         \r\n        for(int i = 0; i &lt; gLoopCount; i++)\r\n            std::cout&lt;&lt;\"Function Object Executing\"&lt;&lt;std::endl;\r\n\r\n        std::cout &lt;&lt; \"[ThreadFunctionObjectCallback] Thread completed!\" &lt;&lt; '\\n';\r\n    }\r\n};\r\n\r\n\/\/\/ Ana thread tan\u0131mlay\u0131c\u0131s\u0131\r\nstd::thread::id gMainThreadId = std::this_thread::get_id();\r\n\r\nint main()  \r\n{\r\n    std::cout &lt;&lt; \"The Main Thread started. ID: \" &lt;&lt; gMainThreadId &lt;&lt; '\\n';\r\n\r\n    \/\/\/ \u00c7al\u0131\u015fma zaman\u0131n\u0131 \u00f6l\u00e7mek i\u00e7in\r\n    auto start = std::chrono::high_resolution_clock::now();\r\n\r\n    \/\/\/ Ba\u011f\u0131ms\u0131z metot \u00f6rne\u011fi: \u0130lgili fonksiyonu thread'e ge\u00e7iriyoruz\r\n    std::thread standaloneThreadObj(threadFunction);\r\n\r\n    \/\/\/ Thread tan\u0131mlay\u0131c\u0131s\u0131na ili\u015fkin kullan\u0131m\r\n    std::cout &lt;&lt; \"[ThreadStandaloneFuncCallback] Thread ID: \"&lt;&lt; standaloneThreadObj.get_id() &lt;&lt; '\\n';\r\n\r\n    \/\/\/ S\u0131n\u0131f \u00fcye metot kullan\u0131m\u0131: \u0130lgili metot ve s\u0131n\u0131f nesnesini ge\u00e7irelim\r\n    std::unique_ptr&lt;Task&gt; taskObj = std::make_unique&lt;Task&gt;();\r\n    std::thread classMemberThreadObj(&amp;Task::execute, taskObj.get(), gLoopCount);\r\n\r\n    \/\/\/ Fonskiyon nesnesi \u00f6rne\u011fi: \u0130lgili fonksiyon nesnesini threade ge\u00e7ireliPass function object to thread\r\n    std::thread functionObjectThreadObj( (DisplayThread()) );\r\n\r\n    \/\/\/ Lambda \u00f6rne\u011fi: Lambda metodunu thread'e ge\u00e7irelim\r\n    std::thread lambdaThreadObj([]{\r\n            std::cout &lt;&lt; \"[ThreadLambdaCallback] Thread started!\" &lt;&lt; '\\n';\r\n            std::cout &lt;&lt; \"[ThreadLambdaCallback] Thread ID: \"&lt;&lt; std::this_thread::get_id() &lt;&lt; '\\n';\r\n\r\n            \/\/\/ 2 sn bekle\r\n            std::this_thread::sleep_for(2s);\r\n\r\n            for(int i = 0; i &lt; gLoopCount; i++)\r\n                std::cout &lt;&lt; \"Lambda Executing\" &lt;&lt; '\\n';\r\n            std::cout &lt;&lt; \"[ThreadLambdaCallback] Thread completed!\" &lt;&lt; '\\n';});\r\n            \r\n    for(int i = 0; i &lt; gLoopCount; i++)\r\n        std::cout &lt;&lt; \"[MainThread] Display From Main Thread\" &lt;&lt; '\\n';\r\n        \r\n    std::cout &lt;&lt; \"Waiting For Threads to complete\" &lt;&lt; '\\n';\r\n\r\n    \/\/\/ Ba\u011f\u0131ms\u0131z metot ge\u00e7irilen thread'i beklemeyelim\r\n    standaloneThreadObj.detach();\r\n    classMemberThreadObj.join();\r\n    functionObjectThreadObj.join();\r\n    lambdaThreadObj.join();\r\n\r\n    auto end = std::chrono::high_resolution_clock::now();\r\n    std::chrono::duration&lt;double, std::milli&gt; elapsed = end - start;\r\n    std::cout &lt;&lt; \"Total execution time \" &lt;&lt; elapsed.count() &lt;&lt; \" ms\\n\";\r\n\r\n    std::cout &lt;&lt; \"Exiting from Main Thread\" &lt;&lt; '\\n';\r\n    return 0;\r\n}<\/pre>\n<p>Ayn\u0131 anda \u00e7al\u0131\u015ft\u0131r\u0131labilicek thread adeti <em>std::thread::hardware_ concurrency<\/em>() metodu ile a\u015fa\u011f\u0131da g\u00f6sterildi\u011fi \u015fekilde \u00f6\u011frenilebilir. Bu genelde i\u015flemci \u00e7ekirdek adetini d\u00f6ner. Bu \u00f6zellikle dinamik olarak thread olu\u015fturma ve bunlar\u0131 i\u015flemci \u00e7ekirdek adetinden ba\u011f\u0131ms\u0131z \u015fekilde y\u00f6netmek istedi\u011finiz durumlarda size yard\u0131m olabilir.<\/p>\n<pre class=\"lang:c++ decode:true\">#include &lt;iostream&gt;\r\n#include &lt;thread&gt;\r\n \r\nint main() \r\n{\r\n    unsigned int n = std::thread::hardware_concurrency();\r\n    std::cout &lt;&lt; n &lt;&lt; \" concurrent threads are supported.\\n\";\r\n}<\/pre>\n<h2><span style=\"color: #0000ff;\"><strong>Thread&#8217;leri birle\u015ftirmek\/ay\u0131rmak:<\/strong><\/span><\/h2>\n<p>Thread&#8217;leri nas\u0131l olu\u015fturabilece\u011fimize bakt\u0131k. \u015eimdi de onlar\u0131n nas\u0131l tamamland\u0131\u011f\u0131na bakaca\u011f\u0131z. Bu iki \u015fekilde ger\u00e7ekle\u015ftiriliyor: birle\u015ftirmek (<em>join<\/em>) ya da ay\u0131rmak (<em>detach<\/em>).<\/p>\n<p>Thread&#8217;e ge\u00e7irilen metot tamamland\u0131\u011f\u0131 zaman, k\u00fct\u00fcphane baz\u0131 thread tamamlanma i\u015fleri yapar ve topu i\u015fletim sistemine atar.<\/p>\n<p>Yukar\u0131da verilen \u00f6rnekte e\u011fer thread&#8217;lerin tamamlanmas\u0131n\u0131 beklemeden <em>main()<\/em> metodundan \u00e7\u0131karsan\u0131z, thread&#8217;lerin 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. Bu sebeple thread&#8217;ler ile \u00e7al\u0131\u015f\u0131rken, birle\u015ftirmek i\u00e7in <em>join()<\/em> ya da ay\u0131rmak i\u00e7in <em>detach()<\/em> API&#8217;lerini \u00e7a\u011f\u0131rd\u0131\u011f\u0131n\u0131zdan emin olun. <em>join()<\/em> API&#8217;si bu metodu \u00e7a\u011f\u0131ran thread&#8217;i ilgili thread bitene kadar bekletir ve ilgili thread bitince \u00e7al\u0131\u015fmaya devam eder. Tabi burada, ilgili thread&#8217;in muhakkak d\u00f6nece\u011finden emin olmal\u0131s\u0131n\u0131z aksi takdirde, \u00e7a\u011f\u0131ran thread sonsuza kadar bekler :). E\u011fer \u00e7a\u011f\u0131ran thread&#8217;in ilgili thread&#8217;i beklemesini istemiyorsan\u0131z o zaman da <em>detach()<\/em> API&#8217;ni kullan\u0131rs\u0131n\u0131z ve bu durumda \u00e7a\u011f\u0131ran thread \u00e7al\u0131\u015fmaya devam eder. Bu noktadan sonra, ilgili thread \u00fczerinde herhangi bir kontrol\u00fc de olmaz.<\/p>\n<p>Burada \u00f6nemli bir nokta, mevcut thread&#8217;in ili\u015fkisi bulunmad\u0131\u011f\u0131 ya da mevcut olmayan bir thread&#8217;e ili\u015fkin <em>join()<\/em>\u00a0ve\u00a0<em>detach()<\/em> API&#8217;lerini \u00e7a\u011f\u0131rmamakt\u0131r. Aksi durumda uygulaman\u0131z beklenmedik bir \u015fekilde sonlanabilir.<\/p>\n<h2><span style=\"color: #0000ff;\"><strong>Thread&#8217;lere parametrelerin ge\u00e7irilmesi:<\/strong><\/span><\/h2>\n<p>Biraz da thread&#8217;lere, daha do\u011frusu, thread metotlar\u0131na nas\u0131l parametre ge\u00e7irebilirize bakmaya. Asl\u0131na bakarsan\u0131z, ilk verdi\u011fim \u00f6rnekte s\u0131n\u0131f \u00fcyesi metot kullan\u0131m\u0131nda buna \u00f6rnek vermi\u015f oldum ki orada da parametre thread nesne yap\u0131c\u0131s\u0131na arg\u00fcman olarak ge\u00e7iriliyor. Asl\u0131nda bakarsan\u0131z, di\u011fer kullan\u0131mlar da ayn\u0131. Tabi burada, thread&#8217;lere ge\u00e7irdi\u011finiz parametrelerin ge\u00e7erlili\u011finin korunmas\u0131ndan sizlerin, yani \u00e7a\u011f\u0131ran thread&#8217;in, sorumlu oldu\u011funu unutmamak. \u00d6rne\u011fin, dinamik olarak bellekten ayr\u0131lm\u0131\u015f bir nesneyi ilgili thread&#8217;e ge\u00e7irip daha sonra bunu silerseniz s\u0131k\u0131nt\u0131 ya\u015fars\u0131n\u0131z ya da yerel bir de\u011fi\u015fkeni ge\u00e7irip, bu de\u011fi\u015fken kapsam d\u0131\u015f\u0131na \u00e7\u0131karsa, benzer \u015fekilde s\u0131k\u0131nt\u0131 ya\u015fayabilirsiniz. A\u015fa\u011f\u0131daki \u00f6rnek de, bu kullan\u0131mlara \u00f6rnekler verdim:<\/p>\n<pre class=\"lang:c++ decode:true\">void execute(const std::string&amp; filename);\r\n\r\nvoid localVariableExample(const char* parameter)\r\n{\r\n    char buffer[50];\r\n    sprintf(buffer, \"%s\", parameter);\r\n\r\n    \/\/\/ Bir thread olu\u015ftural\u0131m ve yerel buffer de\u011fi\u015fkenini ona ge\u00e7irelim\r\n    std::thread newThread(execute, buffer);\r\n\r\n    \/\/\/ Bu noktada ilgili yerel de\u011fi\u015fken art\u0131k tan\u0131ms\u0131z hale geldi\u011fi i\u00e7in newThread i\u00e7erisindeki de\u011fi\u015fken de art\u0131k tan\u0131ms\u0131z hale gelmi\u015f oluyor.\r\n    \/\/\/ Tabi bir kopyas\u0131n\u0131 almad\u0131 ise\r\n    newThread.detach();\r\n}<\/pre>\n<p>Bunu \u00f6nleme i\u00e7in yeni bir <em>std::string<\/em> olu\u015fturulup, bu string thread&#8217;e ge\u00e7irilebilir.<\/p>\n<p>Ayr\u0131ca thread&#8217;lere referans ge\u00e7irmeniz durumunda da dikkat etmeniz gereken bir durum var. A\u015fa\u011f\u0131daki \u00f6rnek kod ile bu duruma bakal\u0131m:<\/p>\n<pre class=\"lang:c++ decode:true\">void execute(std::string&amp; str)\r\n{\r\n    str.assign(\"Updated Hello World!\"); \r\n}\r\n\r\nvoid passByReferenceExample(const char* parameter)\r\n{ \r\n    std::string str(\"Hello World!\");\r\n\r\n    \/\/ \"str\" 'i referans olarak ge\u00e7irmek istiyoruz\r\n    std::thread newThread(execute, str);\r\n\r\n    \/\/ Tamamlanmas\u0131n\u0131 bekleyelim (yani yerel de\u011fi\u015fkenin tan\u0131ms\u0131z olma durumu yok)\r\n    newThread.join();\r\n\r\n    \/\/ Fakat de\u011fi\u015fken de\u011feri g\u00fcncellenmedi?\r\n    std::cout&lt;&lt; str&lt;&lt; std::endl;\r\n}<\/pre>\n<p>Her ne kadar, thread metodu parametreyi referans olarak al\u0131yor olsa da, yeni thread olu\u015fturulurken str 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 &#8220;Updated Hello World!&#8221; metnini i\u00e7eren str de\u011fi\u015fkeni, thread metoduna ge\u00e7irilen ve kopyalar\u0131 olu\u015fturulan di\u011fer parametreler ile birlikte yok edilir. Bu sebeple de as\u0131l str 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\u0131labilir. A\u015fa\u011f\u0131da bu kullan\u0131m g\u00f6sterilmi\u015ftir:<\/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><span style=\"color: #0000ff;\"><strong>Thread sahipliklerinin aktar\u0131lmas\u0131:<\/strong><\/span><\/h2>\n<p lang=\"ro-RO\">Yaz\u0131m\u0131 tamamlamadan \u00f6nce bahsetmek istedi\u011fim son konu da thread&#8217;lerin sahipli\u011fi ile alakal\u0131 olacak. A\u00e7\u0131k\u00e7as\u0131 <strong><span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"https:\/\/www.bogotobogo.com\/cplusplus\/multithreaded4_cplusplus11.php\">bu yaz\u0131da<\/a><\/span><\/strong>\u00a0verilen anoloji ho\u015fuma gitti. \u0130lgili yaz\u0131da thread&#8217;in sahipli\u011fi std::unique_ptr&#8217;\u0131n kine benzetilmi\u015f ki kendisine ait nesneler kopyalanam\u0131yor sadece ta\u015f\u0131nabiliyor. Ayn\u0131 durumu thread&#8217;ler i\u00e7in de ge\u00e7erli, thread nesnelerini bir di\u011fer thread de\u011fi\u015fkenine atayam\u0131yorsunuz, bunun i\u00e7in std::move() kullanman\u0131z gerekiyor (std::move ile ilgili malumata daha \u00f6nceki yaz\u0131lar\u0131mdan ula\u015fabilirsiniz). Peki bu sahiplik olay\u0131 bizlere nerede laz\u0131m olabilir? \u00d6ncelikli olarak sizler i\u00e7in bir thread olu\u015fturup arka planda \u00e7al\u0131\u015ft\u0131rmay\u0131 ama\u00e7layan bir s\u0131n\u0131f tasarlamak isteyebilirsiniz ya da basit\u00e7e olu\u015fturmu\u015f oldu\u011funuz thread&#8217;in sahipli\u011fini bir ba\u015fka metoda ge\u00e7irmek isteyebilirsiniz. Yeni bir thread nesnesi olu\u015fturarak, ge\u00e7ici bir de\u011fi\u015fkene atad\u0131\u011f\u0131n\u0131z durumda \u00f6zel olarak std::move() \u00e7a\u011f\u0131rman\u0131za gerek yok. \u00c7\u00fcnk\u00fc ge\u00e7ici nesnelerden sahipli\u011fin aktar\u0131lmas\u0131 otomatik ve kendili\u011finden yap\u0131labiliyor.<\/p>\n<p class=\"newstyle1\" lang=\"ro-RO\">std::thread nesnesi olu\u015fturan create_thread() fonksiyonu ile arka planda \u00e7al\u0131\u015fan bir thread olu\u015fturmak da, bir metot arac\u0131l\u0131\u011f\u0131 ile thread nesnesi olu\u015fturup sahipli\u011fini aktarmak i\u00e7in de, ilgili std::thread nesnesi sahipli\u011fini aktarman\u0131z gerekir. A\u015fa\u011f\u0131da bu kullan\u0131mlara ili\u015fkin \u00f6rnek kodu g\u00f6rebilirsiniz:<\/p>\n<pre class=\"lang:c++ decode:true\">#include &lt;thread&gt;\r\n#include &lt;iostream&gt;\r\n\r\nvoid threadFunction(int n)\r\n{\r\n\tfor (int i = 0; i &lt; n; ++i)\r\n\t{\r\n\t\tstd::cout &lt;&lt; \"Thread iteration \" &lt;&lt; i &lt;&lt; '\\n';\r\n\t}\r\n}\r\n\r\nstd::thread createThread()\r\n{\r\n\t\/\/\/ Yeni bir thread nesnesi olu\u015ftur ve d\u00f6n\r\n\tstd::thread newThreadObj(threadFunction, 24);\r\n\treturn newThreadObj;\r\n}\r\n\r\nint main()\r\n{\r\n\t\/\/\/ Yeni bir thread nesnesi olu\u015fturuluyor ve sahipli\u011fi\r\n        \/\/\/ sahipli\u011fi firstThread'e dolayl\u0131 olarak aktar\u0131l\u0131yor\r\n\tstd::thread firstThread(threadFunction, 25);\r\n\r\n\t\/\/\/ firstThread sahipli\u011fi secondThread nesnesine aktar\u0131l\u0131yor\r\n\tstd::thread secondThread = std::move(firstThread);\r\n\r\n\t\/\/\/ Benzer \u015fekilde dolayl\u0131 olarak olu\u015fturulmu\u015f thread nesnesinin sahipli\u011fi\r\n        \/\/\/ firstThread'e aktar\u0131l\u0131yor\r\n\tfirstThread = createThread();\r\n\r\n\t\/\/\/ A\u015fa\u011f\u0131daki atama uygulaman\u0131n beklenmedik bir \u015fekilde kapanmas\u0131na neden olur?program! \r\n\t\/\/\/ secondThread \u00e7\u00fcnk\u00fc ilintilendirilmi\u015f bir thread nesnesine sahip ve\r\n        \/\/\/ bu \u015fekilde bir atama hataya sebebiyet veriyor.\r\n\t\/\/ secondThread = std::move(firstThread);\r\n\r\n        \/\/\/ Derleme hatas\u0131. Thread nesneleri bu \u015fekilde kopyalanamaz\r\n        \/\/\/ std::thread tmpThread = firstThread;\r\n\r\n\t\/\/\/ Threadlerin tamamlanmas\u0131 i\u00e7in bekleyelim\r\n\tfirstThread.join();\r\n\tsecondThread.join();\r\n\r\n\treturn 0;\r\n}<\/pre>\n<p lang=\"ro-RO\">Bu b\u00f6l\u00fcm\u00fc ilgili thread nesnelerinin <em>std::vector<\/em>\u00a0benzeri konteyn\u0131rlar ile kullan\u0131m\u0131na ili\u015fkin bir \u00f6rnek ile kapatay\u0131m. Bu kullan\u0131m \u00f6zellikle thread havuzu tarz\u0131 yap\u0131lar i\u00e7in kullan\u0131\u015fl\u0131 olabilir.<\/p>\n<pre class=\"lang:c++ decode:true\">#include &lt;thread&gt;\r\n#include &lt;mutex&gt;\r\n#include &lt;vector&gt;\r\n#include &lt;iostream&gt;\r\n#include &lt;chrono&gt;\r\n\r\nint main()\r\n{\r\n\t\/\/ Thread'lerden olu\u015fan bir konteyn\u0131r olu\u015ftural\u0131m\r\n\tstd::vector&lt;std::thread&gt; vecOfThreads;\r\n\r\n\t\/\/ Thread'ler i\u00e7in fonksiyon nesnesi olu\u015ftural\u0131m\r\n\tstd::function &lt; void() &gt; func = []() \r\n\t{\r\n\t\t\/\/ 5 sn bekle\r\n\t\tstd::this_thread::sleep_for(std::chrono::seconds(5));\r\n\t\t\r\n\t\t\/\/ Thread tan\u0131mlay\u0131c\u0131s\u0131n\u0131 g\u00f6ster\r\n\t\tstd::cout &lt;&lt; \"Thread ID : \" &lt;&lt; std::this_thread::get_id() &lt;&lt; '\\n';\r\n\t};\r\n\r\n\t\/\/ Konteyn\u0131r'a yeni bir thread ekle\r\n\tvecOfThreads.push_back(std::thread(func));\r\n\r\n\t\/\/ 3 farkl\u0131 thread nesnesi olu\u015ftur\r\n\tstd::thread th1(func);\r\n\tstd::thread th2(func);\r\n\tstd::thread th3(func);\r\n\r\n\t\/\/ Hepsini de konteyn\u0131ra ta\u015f\u0131\r\n\tvecOfThreads.push_back(std::move(th1));\r\n\tvecOfThreads.push_back(std::move(th2));\r\n\tvecOfThreads.push_back(std::move(th3));\r\n\r\n\tstd::thread th4(func);\r\n\r\n\t\/\/ \u00c7al\u0131\u015fmaya devam eden bir thread nesnesini yok etmek hata sebebidir\r\n\t\/\/ vecOfThreads[1] = std::move(th4);\r\n\r\n\t\/\/ \u0130lgili thread ile ana thread'i birle\u015ftirelim\r\n\tif (vecOfThreads[1].joinable())\r\n\t\tvecOfThreads[1].join();\r\n\r\n\t\/\/ \u015eimdi ilgili thread nesnesinin \u00e7al\u0131\u015fmas\u0131 bitti\u011fi i\u00e7in yeni bir thread nesnesi aktarabiliriz\r\n\tvecOfThreads[1] = std::move(th4);\r\n\r\n\t\/\/ Benzer \u015fekilde thread nesnelerinden olu\u015fan konteyn\u0131rlar\u0131 da kopyalayamay\u0131z\r\n\t\/\/std::vector&lt;std::thread&gt; newVecThreads = vecOfThreads;\r\n\r\n\t\/\/ Bunlar\u0131 da sadece ta\u015f\u0131yabiliriz\r\n\tstd::vector&lt;std::thread&gt; newVecThreads = std::move(vecOfThreads);\r\n\r\n\t\/\/ Mevcut b\u00fct\u00fcn threadlerin bitmesini bekleyelim\r\n\tfor (std::thread &amp; th : newVecThreads)\r\n\t{\r\n\t\t\/\/ E\u011fer bir thread birle\u015ftirilebilirse, birle\u015ftirelim.\r\n\t\tif (th.joinable())\r\n\t\t\tth.join();\r\n\t}\r\n\r\n\treturn 0;\r\n}<\/pre>\n<h2 lang=\"ro-RO\"><span style=\"color: #0000ff;\"><strong>Sonraki konular:<\/strong><\/span><\/h2>\n<p lang=\"ro-RO\">Bir sonraki yaz\u0131mda thread senkronizasyon yap\u0131lar\u0131ndan, atomic&#8217;lerden ve async kullan\u0131m\u0131ndan bahsetmeyi planl\u0131yorum. Kendinize iyi bak\u0131n ve bunlar\u0131 kullanmaya hemen ba\u015flay\u0131n \ud83d\ude42<\/p>\n<h2><strong><span style=\"color: #0000ff;\">Referanslar:<\/span><\/strong><\/h2>\n<ul>\n<li><strong><span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"https:\/\/randu.org\/tutorials\/threads\/\">https:\/\/randu.org\/tutorials\/threads\/<\/a><\/span><\/strong><\/li>\n<li><strong><span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"https:\/\/www.tutorialspoint.com\/cplusplus\/cpp_multithreading.htm\">https:\/\/www.tutorialspoint.com\/cplusplus\/cpp_multithreading.htm<\/a><\/span><\/strong><\/li>\n<li><strong><span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"https:\/\/www.bogotobogo.com\/cplusplus\/multithreaded4_cplusplus11.php\">https:\/\/www.bogotobogo.com\/cplusplus\/multithreaded4_cplusplus11.php<\/a><\/span><\/strong><\/li>\n<li><strong><span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"https:\/\/users.soe.ucsc.edu\/~sbrandt\/111\/Slides\/chapter2.pdf\">https:\/\/users.soe.ucsc.edu\/~sbrandt\/111\/Slides\/chapter2.pdf<\/a><\/span><\/strong><\/li>\n<li><strong><span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"https:\/\/www.amazon.com\/Modern-Operating-Systems-Andrew-Tanenbaum\/dp\/013359162X\">https:\/\/www.amazon.com\/Modern-Operating-Systems-Andrew-Tanenbaum\/dp\/013359162X<\/a><\/span><\/strong><\/li>\n<li><strong><span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"https:\/\/www.amazon.com\/C-Concurrency-Action-Anthony-Williams\/dp\/1617294691\/ref=pd_lpo_sbs_14_img_0?_encoding=UTF8&amp;psc=1&amp;refRID=ZXET66SHQDZSWECSTNBQ\">https:\/\/www.amazon.com\/C-Concurrency-Action-Anthony-Williams\/dp\/1617294691\/ref=pd_lpo_sbs_14_img_0?_encoding=UTF8&amp;psc=1&amp;refRID=ZXET66SHQDZSWECSTNBQ<\/a><\/span><\/strong><\/li>\n<li><strong><span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"https:\/\/solarianprogrammer.com\/2011\/12\/16\/cpp-11-thread-tutorial\/\">https:\/\/solarianprogrammer.com\/2011\/12\/16\/cpp-11-thread-tutorial\/<\/a><\/span><\/strong><\/li>\n<li><strong><span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"https:\/\/blog.chromium.org\/2008\/09\/multi-process-architecture.html\">https:\/\/blog.chromium.org\/2008\/09\/multi-process-architecture.html<\/a><\/span><\/strong><\/li>\n<\/ul>\n<p><\/p>","protected":false},"excerpt":{"rendered":"<p>Bir ba\u015fka haftal\u0131k C++ yaz\u0131s\u0131 ile tekrar beraberiz. Bu yaz\u0131mda, sizlere C++ 11 ile birlikte sunulmaya ba\u015flanan bir k\u00fct\u00fcphane bilgi aktaraca\u011f\u0131m. Bu k\u00fct\u00fcphaneden daha \u00f6nce tamamlad\u0131\u011f\u0131m Modern C++ yaz\u0131lar\u0131mda bahsetmemi\u015ftim (neden diye sormay\u0131n), ama art\u0131k vakti geldi. Eminim geli\u015ftirdi\u011finiz programlarda, \u00f6zellikle \u00e7oklu \u00e7ekirde\u011fe sahip i\u015flemciler i\u00e7in :), bir noktada buna ihtiyac\u0131n\u0131z olmu\u015ftur.\u00a0 Evet, tahmin edebilece\u011finiz&#8230; <a class=\"more-link\" href=\"https:\/\/www.yazilimperver.com\/index.php\/2018\/12\/31\/english-weekly-c-7-stdthread\/\">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,47,46,296,297,295,42,292,293,294,105,298,291],"class_list":["post-776","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-c","category-modern-c","tag-c","tag-c-0x","tag-c-11","tag-detach","tag-hardware_-concurrency","tag-join","tag-modern-c","tag-multithreaded-programming","tag-process","tag-program","tag-stdmove","tag-stdref","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++ 7- std::thread (I) - 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\/2018\/12\/31\/english-weekly-c-7-stdthread\/\" \/>\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++ 7- std::thread (I)[:en]Weekly C++ 7- std::thread (I)[:] - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\" \/>\n<meta property=\"og:description\" content=\"Bir ba\u015fka haftal\u0131k C++ yaz\u0131s\u0131 ile tekrar beraberiz. Bu yaz\u0131mda, sizlere C++ 11 ile birlikte sunulmaya ba\u015flanan bir k\u00fct\u00fcphane bilgi aktaraca\u011f\u0131m. Bu k\u00fct\u00fcphaneden daha \u00f6nce tamamlad\u0131\u011f\u0131m Modern C++ yaz\u0131lar\u0131mda bahsetmemi\u015ftim (neden diye sormay\u0131n), ama art\u0131k vakti geldi. Eminim geli\u015ftirdi\u011finiz programlarda, \u00f6zellikle \u00e7oklu \u00e7ekirde\u011fe sahip i\u015flemciler i\u00e7in :), bir noktada buna ihtiyac\u0131n\u0131z olmu\u015ftur.\u00a0 Evet, tahmin edebilece\u011finiz... Continue reading &#8594;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.yazilimperver.com\/index.php\/2018\/12\/31\/english-weekly-c-7-stdthread\/\" \/>\n<meta property=\"og:site_name\" content=\"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2018-12-31T13:32:58+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2019-03-08T19:44:48+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=\"36 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\/2018\/12\/31\/english-weekly-c-7-stdthread\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2018\/12\/31\/english-weekly-c-7-stdthread\/\"},\"author\":{\"name\":\"yaz\u0131l\u0131mperver\",\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\"},\"headline\":\"Haftal\u0131k C++ 7- std::thread (I)\",\"datePublished\":\"2018-12-31T13:32:58+00:00\",\"dateModified\":\"2019-03-08T19:44:48+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2018\/12\/31\/english-weekly-c-7-stdthread\/\"},\"wordCount\":5093,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\"},\"keywords\":[\"c++\",\"C++ 0x\",\"C++ 11\",\"detach\",\"hardware_ concurrency\",\"join\",\"Modern C++\",\"multithreaded programming\",\"process\",\"program\",\"std::move\",\"std::ref\",\"thread\"],\"articleSection\":[\"C++\",\"Modern C++\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.yazilimperver.com\/index.php\/2018\/12\/31\/english-weekly-c-7-stdthread\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2018\/12\/31\/english-weekly-c-7-stdthread\/\",\"url\":\"https:\/\/www.yazilimperver.com\/index.php\/2018\/12\/31\/english-weekly-c-7-stdthread\/\",\"name\":\"[:tr]Haftal\u0131k C++ 7- std::thread (I)[:en]Weekly C++ 7- std::thread (I)[:] - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#website\"},\"datePublished\":\"2018-12-31T13:32:58+00:00\",\"dateModified\":\"2019-03-08T19:44:48+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2018\/12\/31\/english-weekly-c-7-stdthread\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.yazilimperver.com\/index.php\/2018\/12\/31\/english-weekly-c-7-stdthread\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2018\/12\/31\/english-weekly-c-7-stdthread\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Ana sayfa\",\"item\":\"https:\/\/www.yazilimperver.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Haftal\u0131k C++ 7- std::thread (I)\"}]},{\"@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++ 7- std::thread (I)[:en]Weekly C++ 7- std::thread (I)[:] - 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\/2018\/12\/31\/english-weekly-c-7-stdthread\/","og_locale":"tr_TR","og_type":"article","og_title":"[:tr]Haftal\u0131k C++ 7- std::thread (I)[:en]Weekly C++ 7- std::thread (I)[:] - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","og_description":"Bir ba\u015fka haftal\u0131k C++ yaz\u0131s\u0131 ile tekrar beraberiz. Bu yaz\u0131mda, sizlere C++ 11 ile birlikte sunulmaya ba\u015flanan bir k\u00fct\u00fcphane bilgi aktaraca\u011f\u0131m. Bu k\u00fct\u00fcphaneden daha \u00f6nce tamamlad\u0131\u011f\u0131m Modern C++ yaz\u0131lar\u0131mda bahsetmemi\u015ftim (neden diye sormay\u0131n), ama art\u0131k vakti geldi. Eminim geli\u015ftirdi\u011finiz programlarda, \u00f6zellikle \u00e7oklu \u00e7ekirde\u011fe sahip i\u015flemciler i\u00e7in :), bir noktada buna ihtiyac\u0131n\u0131z olmu\u015ftur.\u00a0 Evet, tahmin edebilece\u011finiz... Continue reading &#8594;","og_url":"https:\/\/www.yazilimperver.com\/index.php\/2018\/12\/31\/english-weekly-c-7-stdthread\/","og_site_name":"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","article_published_time":"2018-12-31T13:32:58+00:00","article_modified_time":"2019-03-08T19:44:48+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":"36 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.yazilimperver.com\/index.php\/2018\/12\/31\/english-weekly-c-7-stdthread\/#article","isPartOf":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2018\/12\/31\/english-weekly-c-7-stdthread\/"},"author":{"name":"yaz\u0131l\u0131mperver","@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb"},"headline":"Haftal\u0131k C++ 7- std::thread (I)","datePublished":"2018-12-31T13:32:58+00:00","dateModified":"2019-03-08T19:44:48+00:00","mainEntityOfPage":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2018\/12\/31\/english-weekly-c-7-stdthread\/"},"wordCount":5093,"commentCount":0,"publisher":{"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb"},"keywords":["c++","C++ 0x","C++ 11","detach","hardware_ concurrency","join","Modern C++","multithreaded programming","process","program","std::move","std::ref","thread"],"articleSection":["C++","Modern C++"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.yazilimperver.com\/index.php\/2018\/12\/31\/english-weekly-c-7-stdthread\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.yazilimperver.com\/index.php\/2018\/12\/31\/english-weekly-c-7-stdthread\/","url":"https:\/\/www.yazilimperver.com\/index.php\/2018\/12\/31\/english-weekly-c-7-stdthread\/","name":"[:tr]Haftal\u0131k C++ 7- std::thread (I)[:en]Weekly C++ 7- std::thread (I)[:] - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/www.yazilimperver.com\/#website"},"datePublished":"2018-12-31T13:32:58+00:00","dateModified":"2019-03-08T19:44:48+00:00","breadcrumb":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2018\/12\/31\/english-weekly-c-7-stdthread\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.yazilimperver.com\/index.php\/2018\/12\/31\/english-weekly-c-7-stdthread\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.yazilimperver.com\/index.php\/2018\/12\/31\/english-weekly-c-7-stdthread\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Ana sayfa","item":"https:\/\/www.yazilimperver.com\/"},{"@type":"ListItem","position":2,"name":"Haftal\u0131k C++ 7- std::thread (I)"}]},{"@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\/776","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=776"}],"version-history":[{"count":22,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/776\/revisions"}],"predecessor-version":[{"id":1038,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/776\/revisions\/1038"}],"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=776"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/categories?post=776"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/tags?post=776"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}