Asynchronous wait on timer, part two, where a job was executed concurrently to the ASIO handler in another thread, using of a mutex, a lock, and an atomic int to let it work as expected.
With ASIO we can follow a different approach, based on its strand concept, avoiding explicit synchronization.
The point is that we won't run the competing functions directly, but we will post the calls to a strand object, that would ensure they will be executed in a sequential way. Just be sure you use the same strand object.
We have a class, Printer, with two private methods, print1() and print2(), that uses the same member variable, count_, and printing something both to cout.
We post the two functions a first time in the class constructor, asking our strand object to run them.
namespace ba = boost::asio; // ... class Printer { // ... ba::io_context::strand strand_; int count_; Printer(ba::io_context& io, int count) : strand_(io), count_(count) { strand_.post(std::bind(&Printer::print1, this)); strand_.post(std::bind(&Printer::print2, this)); }The functions would post themselves again on the same strand, until some condition is satisfied.
void print1() { if (count_ > 0) { print("one"); --count_; strand_.post(std::bind(&Printer::print1, this)); } }And this is more or less the full story for the Printer class. No need of synchronization, we rely on the strand to have them executed sequentially.
We still have to let ASIO run on two threads, and this is done by calling the run() method from io_context from two different threads. This is kind of interesting on its own, because we bump in an subtle problem due on how std::bind() is implemented.
The official Boost ASIO tutorial suggests to use the Boost implementation:
std::thread thread(boost::bind(&ba::io_context::run, &io));It works fine, end of the story, one would say. But let see what it happens when using the standard bind implementation:
std::thread thread(std::bind(&ba::io_context::run, &io)); // error C2672: 'std::bind': no matching overloaded function found // error C2783: 'std::_Binder<std::_Unforced,_Fx,_Types...> std::bind(_Fx &&,_Types &&...)': could not deduce template argument for '_Fx'Damn it. It tries to be smarter than Boost, and in this peculiar case it doesn't work. The problem is that there are two run() functions in io_context, and bind() doesn't know which one to pick up.
A simple solution would be compile our code for a "clean" ASIO version, getting rid of the deprecated parts, as is the case of the run() overload.
If we can't do that, we should provide an extra help to bind, so that it could understand correctly the function type. An explicit cast would do:
auto run = static_cast<ba::io_context::count_type(ba::io_service::*)()>(&ba::io_context::run); std::thread thread(std::bind(run, &io));I have taken the address of the member function run from boost::asio::io_context (also known as io_service, but now it is deprecated too) and I explicitly casted it to its actual type.
Can we get the same result in a more readable way? Well, using a lambda could be an idea.
std::thread thread([&io] { io.run(); });You could get my full C++ code from GitHub. I based it on the Timer.5 example from the official Boost ASIO tutorial.
elazığ
ReplyDeleteerzincan
bayburt
tunceli
sakarya
R1GO
görüntülü.show
ReplyDeletewhatsapp ücretli show
0EVLE5
https://istanbulolala.biz/
ReplyDeleteJİEH
urfa evden eve nakliyat
ReplyDeletemalatya evden eve nakliyat
burdur evden eve nakliyat
kırıkkale evden eve nakliyat
kars evden eve nakliyat
SMSYFT
6C79F
ReplyDeleteKarabük Evden Eve Nakliyat
Adana Lojistik
Artvin Evden Eve Nakliyat
Afyon Lojistik
Silivri Cam Balkon
Kastamonu Parça Eşya Taşıma
Batman Evden Eve Nakliyat
Van Parça Eşya Taşıma
Ordu Lojistik
5E047
ReplyDeleteMardin Parça Eşya Taşıma
Kayseri Evden Eve Nakliyat
Manisa Lojistik
Etlik Fayans Ustası
Bitlis Evden Eve Nakliyat
Samsun Şehir İçi Nakliyat
Zonguldak Şehirler Arası Nakliyat
Çanakkale Parça Eşya Taşıma
Antalya Şehirler Arası Nakliyat
E89A9
ReplyDeleteZonguldak Lojistik
Bitlis Evden Eve Nakliyat
Çerkezköy Mutfak Dolabı
Kırıkkale Evden Eve Nakliyat
Bilecik Şehirler Arası Nakliyat
Van Evden Eve Nakliyat
Etimesgut Boya Ustası
Eryaman Boya Ustası
Çorum Şehirler Arası Nakliyat
323F2
ReplyDeleteÇerkezköy Boya Ustası
buy primobolan
for sale dianabol methandienone
turinabol for sale
boldenone
Diyarbakır Evden Eve Nakliyat
Hakkari Evden Eve Nakliyat
Iğdır Evden Eve Nakliyat
Erzincan Evden Eve Nakliyat
312D2
ReplyDeleteKeçiören Parke Ustası
sms onay
buy masteron
Adana Lojistik
Samsun Şehir İçi Nakliyat
Bitlis Evden Eve Nakliyat
Sincan Boya Ustası
Ordu Şehir İçi Nakliyat
Elazığ Şehirler Arası Nakliyat
AC746
ReplyDeleteBursa Şehirler Arası Nakliyat
Batman Lojistik
Balıkesir Şehir İçi Nakliyat
Bursa Parça Eşya Taşıma
Urfa Parça Eşya Taşıma
İzmir Parça Eşya Taşıma
Gölbaşı Parke Ustası
Mefa Coin Hangi Borsada
Şırnak Şehir İçi Nakliyat
80B68
ReplyDeleteBolu Lojistik
Bartın Şehirler Arası Nakliyat
Adıyaman Şehirler Arası Nakliyat
Hakkari Şehirler Arası Nakliyat
Kastamonu Şehir İçi Nakliyat
Kastamonu Parça Eşya Taşıma
Çerkezköy Organizasyon
Antep Parça Eşya Taşıma
Btcturk Güvenilir mi
C32CB
ReplyDeleteKeçiören Boya Ustası
Binance Referans Kodu
Çerkezköy Cam Balkon
Keçiören Parke Ustası
Bitlis Evden Eve Nakliyat
Altındağ Fayans Ustası
Karapürçek Parke Ustası
Ünye Halı Yıkama
İzmir Evden Eve Nakliyat
AF5FA
ReplyDeleteTekirdağ Cam Balkon
Kırıkkale Parça Eşya Taşıma
Erzurum Parça Eşya Taşıma
Eryaman Boya Ustası
Bayburt Lojistik
Çorum Şehirler Arası Nakliyat
Pursaklar Boya Ustası
Bursa Şehirler Arası Nakliyat
Düzce Şehirler Arası Nakliyat
29C39
ReplyDeleteBinance Komisyon Ne Kadar
Kripto Para Üretme
Bitcoin Mining Nasıl Yapılır
Bitcoin Üretme
Binance Madenciliği Nedir
Coin Çıkarma Siteleri
Bitcoin Para Kazanma
Coin Kazanma
Kripto Para Üretme
264CF
ReplyDeletemobil sesli sohbet
Gümüşhane En İyi Görüntülü Sohbet Uygulamaları
Bingöl Ücretsiz Sohbet Uygulaması
rastgele görüntülü sohbet uygulamaları
osmaniye görüntülü sohbet canlı
Antalya Mobil Sohbet Et
adana canli sohbet chat
gümüşhane rastgele sohbet siteleri
görüntülü sohbet uygulamaları ücretsiz
5AF88
ReplyDeletemalatya bedava sohbet odaları
Sakarya Rastgele Sohbet Odaları
Giresun Ücretsiz Görüntülü Sohbet
tunceli görüntülü sohbet kızlarla
karaman bedava sohbet
Burdur Mobil Sohbet Et
canli sohbet chat
şırnak rastgele sohbet
erzurum canlı ücretsiz sohbet
5028B
ReplyDeleteSpotify Takipçi Satın Al
Okex Borsası Güvenilir mi
Kripto Para Madenciliği Siteleri
Binance Referans Kodu
Youtube İzlenme Hilesi
Spotify Takipçi Hilesi
Keep Coin Hangi Borsada
Bitranium Coin Hangi Borsada
Görüntülü Sohbet Parasız
F37F7
ReplyDeleteYoutube Abone Satın Al
Lovely Coin Hangi Borsada
Binance Referans Kodu
Okex Borsası Güvenilir mi
Ort Coin Hangi Borsada
Bitcoin Kazanma
Görüntülü Sohbet Parasız
Coin Kazanma Siteleri
Onlyfans Beğeni Hilesi
F2761
ReplyDeleteBitcoin Mining Nasıl Yapılır
Milyon Coin Hangi Borsada
Spotify Dinlenme Satın Al
Bitcoin Hesap Açma
Arbitrum Coin Hangi Borsada
Coin Nasıl Kazılır
Facebook Grup Üyesi Satın Al
Cate Coin Hangi Borsada
Tiktok Beğeni Satın Al
5687F
ReplyDeletetrust wallet
trezor suite
aave
defilama
ledger desktop
arbitrum
shiba
defillama
quickswap
86FC8
ReplyDeletetelegram kripto grupları
ilk kripto borsası
mexc
canli sohbet
kripto para nereden alınır
binance
papaya
binance referans kimliği nedir
binance referans
20C2E
ReplyDeletecanlı sohbet odaları
bitcoin seans saatleri
kripto para telegram grupları
kraken
bybit
kaldıraç ne demek
kripto para nasıl alınır
bitcoin nasıl üretilir
en düşük komisyonlu kripto borsası
5C19CF9397
ReplyDeleteshow