gpt4 book ai didi

c++ - RxCpp RAII 可观察订阅

转载 作者:行者123 更新时间:2023-12-04 11:42:18 25 4
gpt4 key购买 nike

我在模型 View 设置中使用 RxCpp。一个 View 更新方法订阅了一个 observable(通过 lambda 捕获 this)。如果订阅比 View 实例存活时间更长,则会发生未定义的内存访问。我不希望订阅使 View 保持事件状态。因此,我需要订阅在 View 的析构函数上确定性地结束。这听起来像是 RAII 的案例。

这有危险吗?它在某种程度上是对 rx 的滥用吗?我读过更喜欢 take_until在类似的设置中。为什么这会更好,以及如何在这里使用它?

谢谢!

#include "rxcpp/rx.hpp"

class MyView : public View
{
public:
MyView(rxcpp::observable<int> obs) : obs (obs)
{
sub = obs.subscribe ([this] (int i) { update(i); });
}
~MyView()
{
sub.unsubscribe();
}
void update(int i)
{
number = i;
repaint();
}
private:
rxcpp::observable<int> obs;
rxcpp::subscription sub;
int number;
};

最佳答案

take_until当下一个 Action 在它之后组合时是最好的答案。这将确保正确的排序。
问题是取消总是一场竞赛。问题中的代码是 unsubscribe()在析构函数中,然后开始竞争取消。然而,析构函数不会等到订阅结束。这会在析构函数的退出和预期的订阅结束之间产生竞争 this有效。
解决方案是在 unsubscribe() 之后添加某种等待。 .
这可能是对设置在 finally() 中的原子 bool 值的忙等待。在构造函数中的原始订阅上。
或者使用 mutex 可能需要更长时间的等待。和一个 condition_variable (使用 finally() 来表示 condition_variable )。

关于c++ - RxCpp RAII 可观察订阅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48724201/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com