|
发表于 2009-4-2 00:03:42
|
显示全部楼层
1、handle_read_stream 和 handle_write_stream 是不是在同一个线程里执行呢
不一定,看你的设计了。一般不是一个线程,取决于并发设计。
2、不需要等待它完成,handle_write_stream 会自己处理。
我简单解释一下里面的事情:恰好是刚刚有人问过我,我顺便整理一下,贴出来。
关闭时候系统只有两种情况发生
1、你自己主动关闭
2、对方关闭,被你探查到了。
第一种情况,你会在操作完成后,调用closesocket。就是这段
ACE_OS::closesocket(this->handle());
this->handle(ACE_INVALID_HANDLE);
ACE后面的机制是:
while(TRUE)
{
// Wait for I/O to complete on any socket
// associated with the completion port
ret = GetQueuedCompletionStatus(CompletionPort,
XXXXXXXXXXXXXX//循环取结果
就一定会调用handle_read_stream和handle_write_stream,执行必要的清理操作。
第二种情况
你探查到了对方关闭,则你在handle_read_stream中会返回出错,你会间接调用closesocket,而这会引起handle_write_stream被调用
this->application_specific_code (asynch_result,
static_cast<size_t> (bytes_transferred),
(void *)
这是handle_events里面的代码,application_specific_code会调用handle_read_stream和handle_write_stream的
在检测到对方关闭后,handle_read_stream会被调用,但后面又调用了closesocket,会不会返回2次
答案是不会。因为你只投递了一个异步读取请求,也就响应一次,不会再次触发。所以只会再次调用handle_write_stream一次,清理系统。 |
|