Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Покажи как бы выглядел код использующий Asio с этими хэндлерами.
например, так:
class MyClient
{
protected:
tcp::socket m_socket;
task<void> m_ConnectTask;
public:
bool Open()
{
....
m_ConnectTask = m_socket.async_connect( m_endpoint, boost::bind( &MyClient::HandleConnect, this, _1 ) );
}
void Close()
{
m_socket.close();
m_ConnectTask.wait(); //blocks if there is incomplete async op, non blocking if there is no associated async op
}
protected:
void HandleConnect( const boost::system::error_code& err )
{
//do something
}
}
int main()
{
...
MyClient *client = new MyClient();
client->Open();
client->Close();
delete client;
...
}
EP>Часто нужен не явный контроль, а всего лишь prompt finalization, который прекрасно обеспечивается RAII.
я не вижу, как RAII поможет в примере выше. более того, socket.close — это не RAII, однако без него было бы еще сложнее =)
EP>Не надо раздавать shared_ptr кому попало.
дисциплину тяжело крыть автотестами, нужны более понятные средства, помогающие писать надежный софт
EP>Если в какой-то точке программы (в другом потоке?) нужно дождаться момента разрушения какого-то объекта, то необходимо делать блокирующее ожидание.
EP>Ты ссылаешься на то continuation, которое подразумевается в call-with-current-continuation. Есть же второе значение, которое в подразумевается в continuation-passing style.
в CPS тоже речь не о колбеке, а о целой ветке исполнения
EP>Продолжения тоже часто являются замыканиями.
согласен
EP>Я считаю что вполне уместно называть хэндлер асихнронной операции продолжением — это уже устоявшаяся практика.
а я считаю наоборот, это плохая практика, также как и писать "длинна", хоть это и распространенная практика