{"id":2755,"date":"2023-03-19T15:22:13","date_gmt":"2023-03-19T15:22:13","guid":{"rendered":"https:\/\/www.yazilimperver.com\/?p=2755"},"modified":"2023-03-19T15:22:13","modified_gmt":"2023-03-19T15:22:13","slug":"haftalik-c-56-boost-asio-iii-boostbind-boostio_context","status":"publish","type":"post","link":"https:\/\/www.yazilimperver.com\/index.php\/2023\/03\/19\/haftalik-c-56-boost-asio-iii-boostbind-boostio_context\/","title":{"rendered":"Haftal\u0131k C++ 56 \u2013 Boost Asio III \u2013 boost::bind, boost::io_context"},"content":{"rendered":"<p>Merhaba yaz\u0131l\u0131mperver dostlar\u0131m. Bu yaz\u0131m ile birlikte art\u0131k elimizi kirletiyor ve boost k\u00fct\u00fcphanesini adam ak\u0131ll\u0131 kullanmaya ba\u015fl\u0131yoruz. Buna da, asio kabiliyetler ile birlikte olduk\u00e7a s\u0131k kullan\u0131lan bind&#8217;a h\u0131zl\u0131ca bakarak ba\u015fl\u0131yor olaca\u011f\u0131z. Sonra da, io_context s\u0131n\u0131f\u0131na bakaca\u011f\u0131z. \u00d6nceki boost yaz\u0131lar\u0131m i\u00e7in a\u015fa\u011f\u0131daki ba\u011flant\u0131lar\u0131ma g\u00f6z atabilirsiniz:<\/p>\n<p><span style=\"color: #339966;\"><strong><a style=\"color: #339966;\" href=\"https:\/\/www.yazilimperver.com\/index.php\/2023\/01\/29\/haftalik-c-54-boost-asio-i-giris\/\">Haftal\u0131k C++ 54 &#8211; Boost.Asio I &#8211; Giri\u015f<\/a><\/strong><\/span><\/p>\n<p><span style=\"color: #339966;\"><strong><a style=\"color: #339966;\" href=\"https:\/\/www.yazilimperver.com\/index.php\/2023\/02\/14\/haftalik-c-55-boost-asio-ii-temeller-ve-mimari\/\">Haftal\u0131k C++ 55 &#8211; Boost Asio II &#8211; Temeller ve Mimari<\/a><\/strong><\/span><\/p>\n<h2><span style=\"color: #0000ff;\"><strong>boost::bind<\/strong><\/span><\/h2>\n<p>boost::bind, k\u0131saca, farkl\u0131 arg\u00fcman tiplerini alan, fonksiyonlara ge\u00e7iren ve bunun s\u0131ralamas\u0131 konusunda da kolayl\u0131k sa\u011flayan bir mekanizma sunmakta. Peki sadece fonksiyon mu? Hay\u0131r, tekil fonksiyon, s\u0131n\u0131f metotlar\u0131, fonksiyon nesneleri, fonksiyon i\u015faret\u00e7ilerini de bu ba\u011flamda kullanabileceksiniz.<\/p>\n<p>boost::bind, asl\u0131nda daha \u00f6nce std::bind1st() ve std::binds2nd() fonksiyonlar\u0131 ile sunulan bir tak\u0131m \u00f6zellikleri daha basitle\u015ftiren ve genelle\u015ftiren bir kullan\u0131m sunmaktad\u0131r. Bu arada, bu iki kabiliyet, C++98 ile birlikte gelmi\u015f, boost.bind bunlar\u0131 daha kolay kullan\u0131lmas\u0131na sa\u011flayan bir mekanizma sunmakta, zaten C++ 11 ile birlikte std::bind da &lt;functional&gt; ba\u015fl\u0131k dosyas\u0131 ile dahil edilmi\u015f durumda (bu yaz\u0131da bunlar\u0131n farklar\u0131na girmeyece\u011fim ama bire bir ayn\u0131 olmasa da farklar mevcut, merakl\u0131lar\u0131 <strong><span style=\"color: #339966;\"><a style=\"color: #339966;\" href=\"https:\/\/www.google.com\/search?q=std%3A%3Abind+boost%3A%3Abind&amp;rlz=1C1JZAP_enTR868TR868&amp;oq=std%3A%3Abind+boost%3A%3Abind&amp;aqs=chrome..69i57j69i58.5859j0j7&amp;sourceid=chrome&amp;ie=UTF-8\">std::bind vs boost::bind<\/a><\/span><\/strong> sonu\u00e7lar\u0131na g\u00f6z atabilir).<\/p>\n<p>Hemen bir \u00f6rnek ile konuya atlayal\u0131m:<\/p>\n<pre class=\"lang:c++ decode:true\">#include &lt;boost\/bind.hpp&gt;\r\n#include &lt;vector&gt;\r\n#include &lt;algorithm&gt;\r\n#include &lt;iostream&gt;\r\n\r\nvoid PrintSum(std::ostream *os, int i, int j) {\r\n  *os &lt;&lt; \"Toplam: \" &lt;&lt; i  + j  &lt;&lt; '\\n';\r\n}\r\n\r\nclass PrintClass{\r\npublic:\r\n  void PrintSum(std::ostream *os, int i, int j) const  {\r\n    *os &lt;&lt; \"Toplam: \" &lt;&lt; i  + j &lt;&lt; '\\n';\r\n  }\r\n};\r\n\r\nint main()\r\n{\r\n  std::vector&lt;int&gt; v{1, 3, 2};\r\n  \/\/ Tek fonksiyon kullanimi\r\n  \/\/ Her bir elemana bes ekleyelim\r\n  std::for_each(v.begin(), v.end(), boost::bind(PrintSum, &amp;std::cout, _1, 5));\r\n\r\n  \/\/ Sinif uyesi fonksiyon kullanimi\r\n  \/\/ Her bir elemani kendisi ile toplayalim\r\n  PrintClass printObject;\r\n  std::for_each(v.begin(), v.end(), boost::bind(&amp;PrintClass::PrintSum, &amp;printObject, &amp;std::cout, _1, _1));\r\n}<\/pre>\n<p>\u00d6rnek kod san\u0131r\u0131m sizlere, boost::bind&#8217;\u0131n kullan\u0131m\u0131na ili\u015fkin bir fikir verecektir. Temelde, verilen farkl\u0131 \u00e7a\u011fr\u0131labilir fonksiyon, fonksiyon nesnelerine girdileri jenerik bir \u015fekilde iletilebildi\u011fini g\u00f6rebileceksiniz.<\/p>\n<p>Yukar\u0131daki kullan\u0131m yan\u0131nda, std::function benzeri, boost::function kullan\u0131m\u0131nda da, boost::bind kullan\u0131labilir.<\/p>\n<pre class=\"lang:c++ decode:true \">#include &lt;iostream&gt;\r\n#include &lt;boost\/bind.hpp&gt;\r\n#include &lt;boost\/function.hpp&gt;\r\n\r\nvoid PrintDifference(int i, int j) {\r\n\tstd::cout &lt;&lt; \"Fark: \" &lt;&lt; i - j &lt;&lt; '\\n';\r\n}\r\n\r\nint main() {\r\n    \/\/ Asagidaki gibi bir kullanim oldugu gibi, yoruma alinan auto'lu satir da kullanilabilir\r\n\tconst boost::function&lt;void(int, int)&gt; fun1 = boost::bind(&amp;PrintDifference, _1, _2);\r\n\t\/\/ const auto fun = boost::bind(&amp;PrintSum, _1, _2);\r\n\r\n    \/\/ Arguman sirasi bu noktada onemli\r\n\tfun1(5, 6);\r\n\t\r\n\t\/\/ Arguman sirasinin yerini degistirebilirsiniz\r\n\tconst auto fun2 = boost::bind(&amp;PrintDifference, _2, _1);\r\n\tfun2(5, 6);\r\n\t\r\n\t\/\/ Beklenenden fazla girilen argumanlar da goz ardi edilmektedir\r\n\tfun2(8, 3, 2, 5, 6, 1, 7);\r\n\t\r\n\treturn 0;\r\n}<\/pre>\n<p>\u015eimdi biraz asio&#8217;ya taraflar\u0131na yakla\u015fabiliriz.<\/p>\n<h2><span style=\"color: #0000ff;\"><strong>boost::asio::io_context<\/strong><\/span><\/h2>\n<p>boost::bind&#8217;tan sonra art\u0131k asio&#8217;nun temel motivasyonu olan asenkron \u00e7a\u011fr\u0131lara g\u00f6z atman\u0131n zaman\u0131 geldi. Bunun da temelinde io_context s\u0131n\u0131f\u0131 bulunmaktad\u0131r (proactor \u00f6r\u00fcnt\u00fcs\u00fc ger\u00e7ekleyen). \u0130nternet \u00fczerindeki \u00f6rneklerde, boost::asio::io_service s\u0131n\u0131f\u0131n\u0131n da kullan\u0131ld\u0131\u011f\u0131n\u0131 g\u00f6rebilirsiniz ama yeni boost s\u00fcr\u00fcmleri ile birlikte io_context s\u0131n\u0131f\u0131n\u0131n kullan\u0131lmas\u0131 tavsiye edilmektedir. Bu s\u0131n\u0131f k\u0131saca, i\u015fletim sisteminin sundu\u011fu I\/O alt yap\u0131lar\u0131n\u0131 soyutlayarak, kendisine atanan i\u015fi asenkron (veya istenen \u015fekilde) ger\u00e7ekle\u015ftirilmesi i\u00e7in gerekli fonksiyonaliteyi sunar. \u00c7e\u015fitli kaynaklarda &#8220;executor&#8221; olarak da kullan\u0131labiliyor.<\/p>\n<p>Bu nesneye (io_context) \u00f6\u011frenece\u011fimiz ilk API\u00a0 <code class=\"email\">run()<\/code>&#8216;d\u0131r. Bu API ile, io_context&#8217;in olay i\u015fleme d\u00f6ng\u00fcs\u00fcn\u00fc ba\u015flat\u0131yoruz. Bu d\u00f6ng\u00fc, i\u015flenecek herhangi bir i\u015f kalmayana kadar ya da ilgili io_context nesnesi durdurulana kadar, \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131\u011f\u0131 thread&#8217;i bloklar. Burada bir di\u011fer g\u00fczel \u00f6zellik (hatta \u00f6l\u00e7eklendirmek isteyece\u011finiz uygulamalar\u0131n\u0131zda ihtiya\u00e7 da duyaca\u011f\u0131n\u0131z) de, bu nesnenin run() API&#8217;sini farkl\u0131 threadlerden de \u00e7a\u011f\u0131rabilece\u011finizdir. Bu sayede, bir nevi thread havuzu da olu\u015fturmu\u015f oluyoruz. Bir di\u011fer ifade ile, verdi\u011finiz i\u015fleri eritecek birden fazla thread olmu\u015f oluyor. \u0130lave bir girdi veya kontrol yapmad\u0131\u011f\u0131n\u0131z m\u00fcddet\u00e7e hangi threadin bu ama\u00e7la kullan\u0131laca\u011f\u0131n\u0131 bilemiyoruz (gerek de olmayacak \u015fekilde uygulamalar\u0131m\u0131z\u0131 tasarlayabiliriz). Bunun yan\u0131nda, run() (ve benzeri run_one, run_until, vb.) API&#8217;lerini ayn\u0131 thread&#8217;ten birden fazla kez \u00e7a\u011f\u0131rmamal\u0131y\u0131z. A\u015fa\u011f\u0131da, kullan\u0131ma ili\u015fkin temel bir \u015fablon bulabilirsiniz:<\/p>\n<pre class=\"lang:c++ decode:true \">boost::asio::io_context io_context;\r\n...\r\nfor (;;) {\r\n  try  {\r\n    io_context.run();\r\n    break;\r\n  }\r\n  catch (my_exception&amp; e)  {\r\n    \/\/ Varsa hatalar, onlar ile ilgilenelim\r\n  }\r\n}<\/pre>\n<p>Di\u011fer ya\u015fam d\u00f6ng\u00fcs\u00fc API&#8217;leri i\u00e7in <span style=\"color: #339966;\"><strong><a style=\"color: #339966;\" href=\"https:\/\/www.boost.org\/doc\/libs\/1_81_0\/doc\/html\/boost_asio\/reference\/io_context.html\">https:\/\/www.boost.org\/doc\/libs\/1_81_0\/doc\/html\/boost_asio\/reference\/io_context.html<\/a><\/strong><\/span> sayfas\u0131na g\u00f6z atabilirsiniz. Burada h\u0131zl\u0131ca poll() API&#8217;sinden de bahsedebilirim. run()&#8217;dan farkl\u0131 olarak, bu API uygulamay\u0131 bekletmeden sadece haz\u0131r kotar\u0131c\u0131lar\u0131\/i\u015flerin i\u015flenmesini sa\u011flar. Ayr\u0131ca, run ve poll API&#8217;lerinin tek i\u015flemi eritmeye y\u00f6nelik API&#8217;leri de bulunmaktad\u0131r. Bunlar\u0131 uygulaman\u0131z\u0131n ihtiyac\u0131na g\u00f6re kullanabilirsiniz.<\/p>\n<p>Bir di\u011fer s\u0131n\u0131f ise <em>executor_work_guard<\/em> (eski s\u00fcr\u00fcmlerde work olarak da kullan\u0131l\u0131yordu). Bu s\u0131n\u0131f\u0131n k\u0131saca g\u00f6revi de, io_context&#8217;in run() API&#8217;sini \u00e7a\u011f\u0131rd\u0131ktan sonra, i\u015f kalmay\u0131nca d\u00f6nmeyip devam etmesini sa\u011flar. Bu kullan\u0131mda, durdurmak i\u00e7in ise, io_context::stop() API&#8217;sini ya da, <em>executor_work_guard&#8217;<\/em>un reset() API&#8217;sini kullanabilirsiniz. A\u015fa\u011f\u0131da da buna ili\u015fkin \u015fablon bir kod bulabilirsiniz:<\/p>\n<pre class=\"lang:c++ decode:true \">boost::asio::io_context io_context;\r\nboost::asio::executor_work_guard&lt;boost::asio::io_context::executor_type&gt;\r\n  = boost::asio::make_work_guard(io_context);\r\n...\r\nwork.reset();<\/pre>\n<p>Evet, ilgili io_context s\u0131n\u0131f\u0131n\u0131 olu\u015fturduk, ba\u015flatt\u0131k ya da durdurduk. \u015eimdi s\u0131ra geldi, bu s\u0131n\u0131f\u0131 kullanarak asenkron i\u015fleri yapt\u0131rmaya.<\/p>\n<p>Bu ama\u00e7la kullanabilece\u011fimiz temel iki API bulunmaktad\u0131r. Bunlar,<code class=\"email\">post()<\/code> ve<code class=\"email\">dispatch()<\/code> API&#8217;leridir.<\/p>\n<ul>\n<li><code class=\"email\">post():<\/code> Verilen i\u015fi kuyru\u011fa koyup, io_context nesnesi taraf\u0131ndan, ilgili thread i\u00e7erisinde ko\u015fturulmas\u0131 (yani \u00e7a\u011fr\u0131lan thread&#8217;ten de\u011fil) i\u00e7in kullan\u0131lan API&#8217;dir,<\/li>\n<li><code class=\"email\">dispatch():<\/code>Bir \u00f6nceki API&#8217;den farkl\u0131 olarak, io_context&#8217;in hemen ilgili i\u015fi ko\u015fturmas\u0131 ve bunu da run(), poll() ya da benzeri API&#8217;lerin \u00e7a\u011fr\u0131ld\u0131\u011f\u0131 threadten yapmas\u0131 i\u00e7in kullan\u0131lan API&#8217;dir ve kuyru\u011fa koymaz.<\/li>\n<\/ul>\n<p>Tahmin edebilece\u011finiz, \u00fczere bu iki API yan\u0131nda bir \u00e7ok di\u011fer API&#8217;de bulunmakta fakat temel i\u015flevleri g\u00f6stermek ve kullanmak ad\u0131na bunlar\u0131n yeterli olaca\u011f\u0131 kan\u0131s\u0131nday\u0131m.<\/p>\n<p>Vermi\u015f oldu\u011fumuz bu i\u015fler bitene kadar daha \u00f6nce bahsetti\u011fim run() API&#8217;si d\u00f6n\u00fc\u015f yapm\u0131yor olacak ve b\u00fct\u00fcn bu i\u015flerin tamamlanmas\u0131n\u0131 bekliyor olacak.<\/p>\n<p>\u015eimdi bu \u00f6\u011frendiklerimizi, kapsaml\u0131 bir \u00f6rnek (<span style=\"color: #339966;\"><strong><a style=\"color: #339966;\" href=\"https:\/\/github.com\/yazilimperver\/asio_adventure\/tree\/master\/boost_bind_example\">https:\/\/github.com\/yazilimperver\/asio_adventure\/tree\/master\/boost_bind_example<\/a><\/strong><\/span>) ile inceleyelim:<\/p>\n<pre class=\"lang:c++ decode:true \">boost::mutex global_stream_lock;\r\n\r\n\/\/ Bu ornek icin tek bir thread olusturuyoruz\r\nvoid WorkerThread(boost::shared_ptr&lt;boost::asio::io_context&gt; ioctx) {\r\n  global_stream_lock.lock();\r\n  std::cout &lt;&lt; \"Thread Basladi.\" &lt;&lt; \" Thread: \" &lt;&lt; boost::lexical_cast&lt;std::string&gt;(boost::this_thread::get_id()) &lt;&lt; \"\\n\";\r\n  global_stream_lock.unlock();\r\n\r\n  ioctx-&gt;run();\r\n\r\n  global_stream_lock.lock();\r\n  std::cout &lt;&lt; \"Thread Bitti.\\n\";\r\n  global_stream_lock.unlock();\r\n}\r\n\r\n\/\/ dispatch() API'si icin kullanilacak\r\n\/\/ Cagiran thread icerisinde cagriliyor ve hemen cagrilir\r\n\/\/ Bu sebeple ilk olarak bu fonksiyonlar \u00e7a\u011fr\u0131l\u0131yor olacaklar.\r\nvoid Dispatch(int i) {\r\n  global_stream_lock.lock();\r\n  std::cout &lt;&lt; \"dispath() fonksiyonu =&gt; i = \" &lt;&lt; i &lt;&lt;  std::endl;\r\n  global_stream_lock.unlock();\r\n}\r\n\r\n\/\/ post() API'si icin kullanilacak\r\n\/\/ Context'in threadi icerisinde cagriliyor ve her zaman kuyruga eklenir\r\nvoid Post(int i) {\r\n  global_stream_lock.lock();\r\n  std::cout &lt;&lt; \"post() fonksiyonu =&gt; i = \" &lt;&lt; i &lt;&lt;  std::endl;\r\n  global_stream_lock.unlock();\r\n}\r\n\r\n\/\/ 5'er adet, iki farkli API araciligi ile is verelim\r\nvoid Running(boost::shared_ptr&lt;boost::asio::io_context&gt; ioctx) {\r\n  for (int x = 0; x &lt; 5; ++x ) {\r\n    \/\/ Iste burada boost::bind ile ilgili fonksiyonlara, dongu numarasini geciriyoruz\r\n    ioctx-&gt;dispatch(boost::bind(&amp;Dispatch, x));\r\n    ioctx-&gt;post(boost::bind(&amp;Post, x));\r\n    boost::this_thread::sleep(boost::posix_time::milliseconds(1000));\r\n  }\r\n}\r\n\r\nint main(void) {\r\n  \/\/ 0 - Temel io_context sinifimizi olusturalim\r\n  boost::shared_ptr&lt;boost::asio::io_context&gt; io_ctx(new boost::asio::io_context);\r\n  boost::asio::executor_work_guard&lt;boost::asio::io_context::executor_type&gt;  worker = boost::asio::make_work_guard(*io_ctx.get());\r\n\r\n  global_stream_lock.lock();\r\n  std::cout &lt;&lt; \"Butun isler bittigi zaman uygulama sonlanacaktir.\" &lt;&lt; std::endl;\r\n  global_stream_lock.unlock();\r\n\r\n  boost::thread_group threads;\r\n  \r\n  \/\/ Burada, boost::bind'i bir threade, thread fonksiyonunu gecirmek icin kullaniyoruz\r\n  threads.create_thread(boost::bind(&amp;WorkerThread, io_ctx));\r\n\r\n  \/\/ Burada da, asio'ya bir is veriyor ve context nesnesini geciriyoruz\r\n  io_ctx-&gt;post(boost::bind(&amp;Running, io_ctx));\r\n\r\n  worker.reset();\r\n  threads.join_all();\r\n\r\n  global_stream_lock.lock();\r\n  std::cout &lt;&lt; \"Butun isler tamamlandi!\" &lt;&lt; std::endl;\r\n  global_stream_lock.unlock();\r\n\r\n  return 0;\r\n}<\/pre>\n<p>Bu \u00f6rnekteki \u00f6nemli noktalar\u0131, numaraland\u0131rarak \u00fczerinden ge\u00e7iyor olal\u0131m:<\/p>\n<ol>\n<li>Yukar\u0131da, io_context nesnesinin i\u015f kalmay\u0131nca (run()) \u00e7\u0131kmamas\u0131 i\u00e7in kullan\u0131m\u0131na de\u011finmi\u015ftik,<\/li>\n<li>\u00d6rnek boyunca, komut sat\u0131r\u0131na yap\u0131lan \u00e7\u0131kt\u0131lar\u0131n birbirine kar\u0131\u015fmamas\u0131 i\u00e7in mutex kullan\u0131yoruz,<\/li>\n<li>io_context i\u00e7in bir thread olu\u015fturup emrine veriyoruz (ileride \u00e7oklu thread \u00f6rneklerine de bak\u0131yor olaca\u011f\u0131z),<\/li>\n<li>io_context nesnesi i\u00e7in post\/dispatch API&#8217;lerini nas\u0131l kullanaca\u011f\u0131m\u0131za, boost::bind \u00fczerinden bakal\u0131m. Burada post() ile ge\u00e7irdi\u011fimiz i\u00e7in, olu\u015fturulan thread i\u00e7erisinde bu ko\u015fturuluyor olacak,<\/li>\n<li>Bu fonksiyon i\u015fletilirken, i\u00e7erisinde post\/dispatch i\u00e7in be\u015fer adet \u00e7a\u011fr\u0131 yap\u0131p davran\u0131\u015f\u0131 g\u00f6rmemizi sa\u011flayacak,<\/li>\n<li>dispatch() i\u00e7in kullan\u0131lan fonksiyon (\u015fu an sadece ne oldu\u011funu bas\u0131yor),<\/li>\n<li>post() i\u00e7in kullan\u0131lan fonksiyon (\u015fu an sadece ne oldu\u011funu bas\u0131yor),<\/li>\n<li>Art\u0131k i\u015fler bitti\u011fi i\u00e7in, io_context nesnesini bekletmemize gerek yok.<\/li>\n<\/ol>\n<p>Evet sevgili dostlar, kodun da \u00fczerinden ge\u00e7ti\u011fimize g\u00f6re, \u00e7\u0131kt\u0131ya bir g\u00f6z atal\u0131m:<\/p>\n<pre class=\"lang:ps decode:true \">\u276f .\/boost_bind_example\r\nButun isler bittigi zaman uygulama sonlanacaktir.\r\nThread Basladi. Thread: 7f839925c700\r\ndispath() fonksiyonu =&gt; i = 0\r\ndispath() fonksiyonu =&gt; i = 1\r\ndispath() fonksiyonu =&gt; i = 2\r\ndispath() fonksiyonu =&gt; i = 3\r\ndispath() fonksiyonu =&gt; i = 4\r\npost() fonksiyonu =&gt; i = 0\r\npost() fonksiyonu =&gt; i = 1\r\npost() fonksiyonu =&gt; i = 2\r\npost() fonksiyonu =&gt; i = 3\r\npost() fonksiyonu =&gt; i = 4\r\nThread Bitti.\r\nButun isler tamamlandi!<\/pre>\n<p>\u00d6ncelikli olarak, dispatch() API&#8217;lerinin eritildi\u011fine dikkat edelim. Bu arada, bu ve sonraki yaz\u0131l\u0131lar\u0131m i\u00e7in kullanaca\u011f\u0131m \u00f6rneklere a\u015fa\u011f\u0131daki repo&#8217;dan ula\u015fabilirsiniz:<\/p>\n<p><a href=\"https:\/\/github.com\/yazilimperver\/asio_adventure\"><span style=\"color: #339966;\"><strong>https:\/\/github.com\/yazilimperver\/asio_adventure<\/strong><\/span><\/a><\/p>\n<p>Bir sonraki yaz\u0131mda g\u00f6r\u00fc\u015fmek dile\u011fiyle, bol kodlu g\u00fcnler diliyorum.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Merhaba yaz\u0131l\u0131mperver dostlar\u0131m. Bu yaz\u0131m ile birlikte art\u0131k elimizi kirletiyor ve boost k\u00fct\u00fcphanesini adam ak\u0131ll\u0131 kullanmaya ba\u015fl\u0131yoruz. Buna da, asio kabiliyetler ile birlikte olduk\u00e7a s\u0131k kullan\u0131lan bind&#8217;a h\u0131zl\u0131ca bakarak ba\u015fl\u0131yor olaca\u011f\u0131z. Sonra da, io_context s\u0131n\u0131f\u0131na bakaca\u011f\u0131z. \u00d6nceki boost yaz\u0131lar\u0131m i\u00e7in a\u015fa\u011f\u0131daki ba\u011flant\u0131lar\u0131ma g\u00f6z atabilirsiniz: Haftal\u0131k C++ 54 &#8211; Boost.Asio I &#8211; Giri\u015f Haftal\u0131k C++ 55&#8230; <a class=\"more-link\" href=\"https:\/\/www.yazilimperver.com\/index.php\/2023\/03\/19\/haftalik-c-56-boost-asio-iii-boostbind-boostio_context\/\">Continue reading <span class=\"meta-nav\">&#8594;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":2769,"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":[1077,1076,1084,1079,253,370,1083,1078,1082,1080,1081],"class_list":["post-2755","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-c","category-modern-c","tag-boostasio","tag-boostbind","tag-boostio_context","tag-dispatch","tag-functional","tag-mutex","tag-poll","tag-post","tag-run","tag-stdbind1st","tag-stdbinds2nd"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v21.0 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Haftal\u0131k C++ 56 \u2013 Boost Asio III \u2013 boost::bind, boost::io_context - 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\/2023\/03\/19\/haftalik-c-56-boost-asio-iii-boostbind-boostio_context\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Haftal\u0131k C++ 56 \u2013 Boost Asio III \u2013 boost::bind, boost::io_context - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\" \/>\n<meta property=\"og:description\" content=\"Merhaba yaz\u0131l\u0131mperver dostlar\u0131m. Bu yaz\u0131m ile birlikte art\u0131k elimizi kirletiyor ve boost k\u00fct\u00fcphanesini adam ak\u0131ll\u0131 kullanmaya ba\u015fl\u0131yoruz. Buna da, asio kabiliyetler ile birlikte olduk\u00e7a s\u0131k kullan\u0131lan bind&#8217;a h\u0131zl\u0131ca bakarak ba\u015fl\u0131yor olaca\u011f\u0131z. Sonra da, io_context s\u0131n\u0131f\u0131na bakaca\u011f\u0131z. \u00d6nceki boost yaz\u0131lar\u0131m i\u00e7in a\u015fa\u011f\u0131daki ba\u011flant\u0131lar\u0131ma g\u00f6z atabilirsiniz: Haftal\u0131k C++ 54 &#8211; Boost.Asio I &#8211; Giri\u015f Haftal\u0131k C++ 55... Continue reading &#8594;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.yazilimperver.com\/index.php\/2023\/03\/19\/haftalik-c-56-boost-asio-iii-boostbind-boostio_context\/\" \/>\n<meta property=\"og:site_name\" content=\"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2023-03-19T15:22:13+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2023\/03\/boost.jpeg\" \/>\n\t<meta property=\"og:image:width\" content=\"192\" \/>\n\t<meta property=\"og:image:height\" content=\"192\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\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=\"8 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\/2023\/03\/19\/haftalik-c-56-boost-asio-iii-boostbind-boostio_context\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2023\/03\/19\/haftalik-c-56-boost-asio-iii-boostbind-boostio_context\/\"},\"author\":{\"name\":\"yaz\u0131l\u0131mperver\",\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\"},\"headline\":\"Haftal\u0131k C++ 56 \u2013 Boost Asio III \u2013 boost::bind, boost::io_context\",\"datePublished\":\"2023-03-19T15:22:13+00:00\",\"dateModified\":\"2023-03-19T15:22:13+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2023\/03\/19\/haftalik-c-56-boost-asio-iii-boostbind-boostio_context\/\"},\"wordCount\":1189,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\"},\"keywords\":[\"boost::asio\",\"boost::bind\",\"boost::io_context\",\"dispatch\",\"functional\",\"mutex\",\"poll\",\"post\",\"run\",\"std::bind1st()\",\"std::binds2nd()\"],\"articleSection\":[\"C++\",\"Modern C++\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.yazilimperver.com\/index.php\/2023\/03\/19\/haftalik-c-56-boost-asio-iii-boostbind-boostio_context\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2023\/03\/19\/haftalik-c-56-boost-asio-iii-boostbind-boostio_context\/\",\"url\":\"https:\/\/www.yazilimperver.com\/index.php\/2023\/03\/19\/haftalik-c-56-boost-asio-iii-boostbind-boostio_context\/\",\"name\":\"Haftal\u0131k C++ 56 \u2013 Boost Asio III \u2013 boost::bind, boost::io_context - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#website\"},\"datePublished\":\"2023-03-19T15:22:13+00:00\",\"dateModified\":\"2023-03-19T15:22:13+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2023\/03\/19\/haftalik-c-56-boost-asio-iii-boostbind-boostio_context\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.yazilimperver.com\/index.php\/2023\/03\/19\/haftalik-c-56-boost-asio-iii-boostbind-boostio_context\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2023\/03\/19\/haftalik-c-56-boost-asio-iii-boostbind-boostio_context\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Ana sayfa\",\"item\":\"https:\/\/www.yazilimperver.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Haftal\u0131k C++ 56 \u2013 Boost Asio III \u2013 boost::bind, boost::io_context\"}]},{\"@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":"Haftal\u0131k C++ 56 \u2013 Boost Asio III \u2013 boost::bind, boost::io_context - 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\/2023\/03\/19\/haftalik-c-56-boost-asio-iii-boostbind-boostio_context\/","og_locale":"tr_TR","og_type":"article","og_title":"Haftal\u0131k C++ 56 \u2013 Boost Asio III \u2013 boost::bind, boost::io_context - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","og_description":"Merhaba yaz\u0131l\u0131mperver dostlar\u0131m. Bu yaz\u0131m ile birlikte art\u0131k elimizi kirletiyor ve boost k\u00fct\u00fcphanesini adam ak\u0131ll\u0131 kullanmaya ba\u015fl\u0131yoruz. Buna da, asio kabiliyetler ile birlikte olduk\u00e7a s\u0131k kullan\u0131lan bind&#8217;a h\u0131zl\u0131ca bakarak ba\u015fl\u0131yor olaca\u011f\u0131z. Sonra da, io_context s\u0131n\u0131f\u0131na bakaca\u011f\u0131z. \u00d6nceki boost yaz\u0131lar\u0131m i\u00e7in a\u015fa\u011f\u0131daki ba\u011flant\u0131lar\u0131ma g\u00f6z atabilirsiniz: Haftal\u0131k C++ 54 &#8211; Boost.Asio I &#8211; Giri\u015f Haftal\u0131k C++ 55... Continue reading &#8594;","og_url":"https:\/\/www.yazilimperver.com\/index.php\/2023\/03\/19\/haftalik-c-56-boost-asio-iii-boostbind-boostio_context\/","og_site_name":"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","article_published_time":"2023-03-19T15:22:13+00:00","og_image":[{"width":192,"height":192,"url":"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2023\/03\/boost.jpeg","type":"image\/jpeg"}],"author":"yaz\u0131l\u0131mperver","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"yaz\u0131l\u0131mperver","Tahmini okuma s\u00fcresi":"8 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.yazilimperver.com\/index.php\/2023\/03\/19\/haftalik-c-56-boost-asio-iii-boostbind-boostio_context\/#article","isPartOf":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2023\/03\/19\/haftalik-c-56-boost-asio-iii-boostbind-boostio_context\/"},"author":{"name":"yaz\u0131l\u0131mperver","@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb"},"headline":"Haftal\u0131k C++ 56 \u2013 Boost Asio III \u2013 boost::bind, boost::io_context","datePublished":"2023-03-19T15:22:13+00:00","dateModified":"2023-03-19T15:22:13+00:00","mainEntityOfPage":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2023\/03\/19\/haftalik-c-56-boost-asio-iii-boostbind-boostio_context\/"},"wordCount":1189,"commentCount":0,"publisher":{"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb"},"keywords":["boost::asio","boost::bind","boost::io_context","dispatch","functional","mutex","poll","post","run","std::bind1st()","std::binds2nd()"],"articleSection":["C++","Modern C++"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.yazilimperver.com\/index.php\/2023\/03\/19\/haftalik-c-56-boost-asio-iii-boostbind-boostio_context\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.yazilimperver.com\/index.php\/2023\/03\/19\/haftalik-c-56-boost-asio-iii-boostbind-boostio_context\/","url":"https:\/\/www.yazilimperver.com\/index.php\/2023\/03\/19\/haftalik-c-56-boost-asio-iii-boostbind-boostio_context\/","name":"Haftal\u0131k C++ 56 \u2013 Boost Asio III \u2013 boost::bind, boost::io_context - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/www.yazilimperver.com\/#website"},"datePublished":"2023-03-19T15:22:13+00:00","dateModified":"2023-03-19T15:22:13+00:00","breadcrumb":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2023\/03\/19\/haftalik-c-56-boost-asio-iii-boostbind-boostio_context\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.yazilimperver.com\/index.php\/2023\/03\/19\/haftalik-c-56-boost-asio-iii-boostbind-boostio_context\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.yazilimperver.com\/index.php\/2023\/03\/19\/haftalik-c-56-boost-asio-iii-boostbind-boostio_context\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Ana sayfa","item":"https:\/\/www.yazilimperver.com\/"},{"@type":"ListItem","position":2,"name":"Haftal\u0131k C++ 56 \u2013 Boost Asio III \u2013 boost::bind, boost::io_context"}]},{"@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\/2755","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=2755"}],"version-history":[{"count":11,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/2755\/revisions"}],"predecessor-version":[{"id":2770,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/2755\/revisions\/2770"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/media\/2769"}],"wp:attachment":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/media?parent=2755"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/categories?post=2755"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/tags?post=2755"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}