Wenn ich boost::asio::strand
wrap
Funktion zu nutzen versucht, so scheint es, die shared_ptr
zu verursachen, die von shared_from_this
kamen NULL zu werden, so dass, wenn es zum zweiten Mal ausgeführt wird, Es wird dazu führen, dass das Programm abstürzt.boost :: asio :: Strangverpackungs Shared_ptr von shared_from_this verursacht NULL werden
Dies geschieht jedoch nur, wenn die Funktion, die gebunden wurde keine Argumente.
Nachdem die Uhr Punkt Einstellung und Überprüfung der Aufrufliste, scheint dieses Verhalten durch Bewegung Konstruktor shared_ptr
Austauschwert verursacht werden, die von async_result_init
mit BOOST_ASIO_MOVE_CAST
entstanden.
Meine Frage ist, wie sollte ich wrap
richtig verwenden, um dies zu vermeiden?
Es folgt ein einfaches Beispiel, Ihnen zu zeigen, was ich meinte:
class object : public boost::enable_shared_from_this<object> {
public:
object()
: service(new boost::asio::io_service),
work(new boost::asio::io_service::work(*service)),
strand(*service),
value(0) {}
void workerThread() {
service->run();
}
void run() {
func_int = strand.wrap(boost::bind(&object::handler_int, shared_from_this(), _1));
func_void = strand.wrap(boost::bind(&object::handler_void, shared_from_this()));
std::thread thread(boost::bind(&object::workerThread, this));
func_int(1);
func_int(1);
func_void();
func_void(); // Will crash due to shared_ptr being NULL, hence "value" cannot be accessed in handler_void
thread.join();
}
void handler_int(int parameter) {
cout << "handler_int: " << value << endl;
}
void handler_void() {
cout << "handler_void: " << value << endl;
}
boost::shared_ptr<boost::asio::io_service> service;
boost::shared_ptr<boost::asio::io_service::work> work;
boost::asio::strand strand;
std::function<void(int)> func_int;
std::function<void(void)> func_void;
int value;
};
int main(int argc, char *argv[]) {
boost::shared_ptr<object> obj(new object());
obj->run();
return 0;
}
Sie nicht das Arbeitsobjekt korrekt initialisieren. –
@RichardHodges: Vielen Dank für Ihre Antwort, aber ich bin mir nicht sicher, ob das der Grund ist. Ich habe 'Arbeit' so auch initialisiert gesehen: [link] (http://www.boost.org/doc/libs/1_45_0/doc/html/boost_asio/example/services/logger_service.hpp) – Bill
verstanden. Es ist ein schlechter Stil, aber die wirkliche Antwort ist unten. –