Tôi đã triển khai một nhóm luồng sử dụng boost::asio
và một số số boost::thread
đối tượng gọi boost::asio::io_service::run()
. Tuy nhiên, một yêu cầu mà tôi đã đưa ra là có một cách để theo dõi tất cả các chủ đề cho "sức khỏe". Mục đích của tôi là tạo một đối tượng sentinel đơn giản có thể được truyền qua pool thread - nếu nó làm cho nó thông qua, thì chúng ta có thể giả định rằng thread vẫn đang xử lý công việc.boost :: asio, hồ bơi chủ đề và theo dõi luồng
Tuy nhiên, khi thực hiện, tôi không chắc chắn cách (nếu) tôi có thể theo dõi tất cả các chủ đề trong hồ bơi một cách đáng tin cậy. Tôi đã chỉ đơn giản là giao chức năng thread để boost::asio::io_service::run()
, do đó, gửi một đối tượng sentinel vào trường hợp io_service
sẽ không đảm bảo thread sẽ thực sự nhận được rằng sentinel và làm công việc.
Một tùy chọn có thể chỉ định kỳ chèn nội dung gửi và hy vọng nó được chọn theo từng chuỗi ít nhất một lần trong một khoảng thời gian hợp lý, nhưng điều đó rõ ràng không lý tưởng.
Lấy ví dụ sau. Do cách mà trình xử lý được mã hóa, trong trường hợp này chúng ta có thể thấy rằng mỗi luồng sẽ thực hiện cùng một lượng công việc, nhưng trong thực tế, tôi sẽ không có quyền kiểm soát việc xử lý trình xử lý, một số có thể chạy dài trong khi một số khác sẽ gần như ngay lập tức.
#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;
}
bạn có thể thêm mã vào câu trả lời của mình @Chad không? –
Xong. Hạnh phúc cho bất kỳ thông tin phản hồi về nó. – Chad