读者来信与解答 1

读者来信用黑色,我的回答用蓝色。经过整理,接近对话体。


> 陈硕,你好,
>
> 阅读了你的书,很有收获。
> 但是没有在moduo的源代码里面找到实现线程模型11的例子。即one thread per loop + thread pool。
> 谢谢。

书第 173 页图 6-14 下面的第一段话,具体改动方法参考前一页的 diff。


> 谢谢。
>
> 另外TcpConnection和Channel的生命周期管理有点问题。
> TcpConnection如果已经被回收了,其包含的Channel也已经被回收了。而这个时候在Channel::handleEvent()里面检查tied_和tie_是危险的。因为其内存已经被回收了。
>
> 如果用户保证TcpConnection被回收之后,不会再用Channel的裸指针,则没有必要在TcpConnection::connectEstablished()中call tie().

TcpConnection 回收之前,会调用 connectDestroyed,其中调用 channel_->remove();,这样就不可能再会有 Channel::handleEvent() 被调用了。

tie() 的作用是防止 Channel::handleEvent() 运行期间其 owner 对象析构,导致 Channel 本身被销毁。


> > TcpConnection 回收之前,会调用 connectDestroyed,其中调用 channel_->remove();,这样就不可能再会有 Channel::handleEvent() 被调用了
> 这个时候会不会有race condition?假设现在有两个active channels,处理头一个的时候回收TcpConnection,而第二个channel刚好对应这个connection。

这时你没有办法强制销毁 TcpConnection,只能降低其引用计数,所以不会有问题。你可以写段代码试试。

> 另外底层的poller OS api是否保证unregister channel之后一定不会再有这个channel的事件,会清空内核的已经就绪的事件队列?

跟内核没关系,Poller class 在 unregister channel 之后就不可能调用其 handleEvent() 成员函数。

> 那EPollPoller::fillActiveChannels()的改一改,“assert(it != channels_.end());”不再适用了,而且每次都个event都要查一次map。效率会有问题。

assert() 只有在 debug build 才执行,不会影响效率。
再说每个 event 都要涉及 read/write 等系统调用,开销比“查一次 map”大得多,优化这里是无用功。

> 但这个assert()不是invalid了吗?你可能之前在unregister channel的时候已经从map里面remove掉了它。

这个 assert 是有效的,你再想想。


> > tie() 的作用是防止 Channel::handleEvent() 运行期间其 owner 对象析构,导致 Channel 本身被销毁。

> 这个也不太make sense。仍然有race conditon。在Channel::handleEvent()拥有guard锁定ownner之前,Channel::handleEvent()需要检查其tied_。

你再想想,tie 的作用是防止调用 handleEvent() 期间对象销毁(比如调用 closeCallback 期间),不是也不可能防止调用 handleEvent() 之前对象销毁。

> 恩,是的。整个TcpConnection, Channel, EventLoop都是一个thread里面run的。

内容概要:本文档定义了一个名为 `xxx_SCustSuplier_info` 的视图,用于整合和展示客户(Customer)和供应商(Supplier)的相关信息。视图通过连接多个表来获取组织单位、客户账户、站点使用、位置、财务代码组合等数据。对于客户部分,视图选择了账单相关的记录,并提取了账单客户ID、账单站点ID、客户名称、账户名称、站点代码、状态、付款条款等信息;对于供应商部分,视图选择了有效的供应商及其站点信息,包括供应商ID、供应商名称、供应商编号、状态、付款条款、财务代码组合等。视图还通过外连接确保即使某些字段为空也能显示相关信息。 适合人群:熟悉Oracle ERP系统,尤其是应付账款(AP)和应收账款(AR)模块的数据库管理员或开发人员;需要查询和管理客户及供应商信息的业务分析师。 使用场景及目标:① 数据库管理员可以通过此视图快速查询客户和供应商的基本信息,包括账单信息、财务代码组合等;② 开发人员可以利用此视图进行报表开发或数据迁移;③ 业务分析师可以使用此视图进行数据分析,如信用评估、付款周期分析等。 阅读建议:由于该视图涉及多个表的复杂连接,建议读者先熟悉各个表的结构和关系,特别是 `hz_parties`、`hz_cust_accounts`、`ap_suppliers` 等核心表。此外,注意视图中使用的外连接(如 `gl_code_combinations_kfv` 表的连接),这可能会影响查询结果的完整性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值