izleme iplik ve boost::asio::io_service::run()
çağırarak bazı sayı boost::thread
nesneler. Bununla birlikte, benim verdiğim bir şart, tüm konuları "sağlık" için izlemenin bir yolu olmalı. Amacım, iş parçacığı havuzundan geçirilebilen basit bir sentinel nesnesi yapmaktır - eğer bunu gerçekleştirirse, iş parçacığının hala iş işlediğini varsayabiliriz.boost :: asio, iplik havuzları ve ben <code>boost::asio</code> kullanarak bir iş parçacığı havuzu uyguladık
Ancak, benim uygulama göz önüne alındığında, ben (varsa) ben güvenilir havuzda bütün konuları izleyebilirsiniz emin değilim. Sadece bu kadar aslında nöbetçi almak ve iş yapacak iş parçacığı garanti etmeyeceğini io_service
örneğine bir gözcü nesnesi gönderme, boost::asio::io_service::run()
için iplik işlevini delege ettik.
Bir seçenek sadece periyodik nöbetçi eklemek olacak ve bir kısım zaman makul miktarda en az bir kez her iş parçacığı tarafından alınan, ama bu besbelli ideal değildir alır umut olabilir.
aşağıdaki örneğini ele alalım. Diğerleri neredeyse olacak ise işleyici kodlanmış bu şekilde nedeniyle, bu durumda her iplik çalışması aynı miktarda yapacak görebilirsiniz, ama gerçekte ben işleyici uygulamasının kontrole sahip olmayacak, bazı uzun çalışan olabilir derhal.
#include <iostream>
#include <boost/asio.hpp>
#include <vector>
#include <boost/thread.hpp>
#include <boost/bind.hpp>
void handler()
{
std::cout << boost::this_thread::get_id() << "\n";
boost::this_thread::sleep(boost::posix_time::milliseconds(100));
}
int main(int argc, char **argv)
{
boost::asio::io_service svc(3);
std::unique_ptr<boost::asio::io_service::work> work(new boost::asio::io_service::work(svc));
boost::thread one(boost::bind(&boost::asio::io_service::run, &svc));
boost::thread two(boost::bind(&boost::asio::io_service::run, &svc));
boost::thread three(boost::bind(&boost::asio::io_service::run, &svc));
svc.post(handler);
svc.post(handler);
svc.post(handler);
svc.post(handler);
svc.post(handler);
svc.post(handler);
svc.post(handler);
svc.post(handler);
svc.post(handler);
svc.post(handler);
work.reset();
three.join();
two.join();
one.join();
return 0;
}
Kodu, cevabınıza @Chad ekleyebilir misiniz? –
Bitti. Herhangi bir geri bildirim için mutlu. – Chad