【发布时间】:2020-09-02 01:14:23
【问题描述】:
我有一个类型的函数
f: fn(x: SomeType, y: Arc<()>) -> ISupposeTheReturnTypeDoesNotMatter
编译时(优化或不优化),y 会被优化掉吗?
y的意图是限制f的运行实例数,如果y被引用次数过多,f的调用者将不会调用f直到引用计数y 的值变小了。
编辑:澄清我的意图
目的是控制正在运行的http请求的数量(由上面的f表示),伪代码如下所示:
let y = Arc::new(());
let all_jobs_to_be_done = vector_of_many_jobs;
loop {
while y.strong_count() < some_predefined_limit {
// we have some free slots, fill them up with instances of f,
// f is passed with a clone of y,
// so that the running of f would increase the ref count,
// and the death of the worker thread would decrease the ref count
let work = all_jobs_to_be_done.pop();
let ticket = y.clone();
spawn_work(move || {f(work, ticket)});
}
sleep_for_a_few_seconds();
}
这个看似 hacky 的解决方法的原因是我找不到满足我需求的库(使用有限数量的异步 (tokio) 工作者使用不断变化的工作队列,并在作业失败时重新排队工作)
【问题讨论】:
-
听起来是个有趣的问题,写一个小测试来调查它的行为
-
我更喜欢规范而不是观察。对于调试构建,观察是它不会被优化掉,但这也可能意味着我没有满足优化器的要求,也许对于其他一些代码安排,它会被优化掉。
-
调试版本不会优化任何东西,除非您手动指定更高级别的优化。
-
既然调用者中的所有引用计数限制逻辑,为什么将
Arc传递给被调用者?正如你所说,它在那里没有使用......我不明白将它保留在函数签名中的目的。 -
@eggyal 要利用移动语义和变量生存期,请参阅我的编辑。
标签: rust compiler-optimization