- 主题:关于lambda俘获变量的生命周期的问题
如果有一函数,经常被调用,里面有一个变量,需要进行一个操作,假定这个操作是异步的,是网络方面进行回叫。
int foo(.) {
int value = 0;
var waiter=...
important_call([&waiter, &value](int update){
// when call back, will destruct waiter
value = update;
waiter.Cancel();
}
waiter.Wait(deadline);
return value;
}
那么,如果超时后,函数返回了0,然后lambda才被呼叫,这个时候waiter已经消失了,是不是?
--
修改:bihai FROM 98.42.143.*
FROM 98.42.143.*
显然吧。capture的是auto变量的引用。
--
FROM 114.240.244.*
意思是lambda被呼叫的时候,会崩溃?怎么避免呢?比如,怎么告诉lambda,不需要执行了,不需要控制waiter了。
【 在 z16166 的大作中提到: 】
: 显然吧。capture的是auto变量的引用。
--
FROM 98.42.143.*
不一定崩,反正是undefined behaviour
这是在两个线程中调用的,一个线程调用foo(),一个线程调用lambda,要做好线程同步
一种方法是两个线程严格同步,无限等那个调用lambda的线程调用完,不超时。或者超时后要cancel。
另一种方法是在堆上分配那个waiter,然后用ref counting,每个线程持有一个ref count。
后者好点。总之两个线程可能同时读/写的数据,都要同步/加锁。
【 在 bihai 的大作中提到: 】
: 意思是lambda被呼叫的时候,会崩溃?怎么避免呢?比如,怎么告诉lambda,不需要执行了,不需要控制waiter了。
:
--
修改:z16166 FROM 114.240.244.*
FROM 114.240.244.*
不放心的话,捕获weak_ptr,用的时候判断一吧.
【 在 bihai (new half life) 的大作中提到: 】
: 如果有一函数,经常被调用,里面有一个变量,需要进行一个操作,假定这个操作是异步的,是网络方面进行回叫。
: int foo(.) {
: int value = 0;
: ...................
--
FROM 218.200.160.*
capture by value or weak_ptr
【 在 bihai 的大作中提到: 】
: 意思是lambda被呼叫的时候,会崩溃?怎么避免呢?比如,怎么告诉lambda,不需要执行了,不需要控制waiter了。
:
--
FROM 122.224.174.*
lambda 一定要用 shared_ptr<> 或者传值啊。
搞异步编程的时候, capture reference 几乎总是错误的。
【 在 bihai (new half life) 的大作中提到: 】
: 如果有一函数,经常被调用,里面有一个变量,需要进行一个操作,假定这个操作是异步的,是网络方面进行回叫。
: int foo(.) {
: int value = 0;
: ...................
--
FROM 125.78.66.*
某些时候可以用unique_ptr
【 在 hgoldfish 的大作中提到: 】
: lambda 一定要用 shared_ptr<> 或者传值啊。
:
: 搞异步编程的时候, capture reference 几乎总是错误的。
: ...................
--
FROM 124.64.16.*
你这都把异步转同步了,callback可以完全不需要这个waiter啊
【 在 bihai 的大作中提到: 】
: 如果有一函数,经常被调用,里面有一个变量,需要进行一个操作,假定这个操作是异步的,是网络方面进行回叫。
: int foo(.) {
: int value = 0;
: ...................
--
FROM 203.208.61.*
我觉得最好也别这样。cpp 不是 rust,追求 unique_ptr<> 很容易在当前函数帧留下空 unique_ptr<>,代码给别人维护很容易就崩溃了。
cpp 程序员总追求零开销优化。我觉得没有必要。不如把时间省下来,去找真正的热门代码。把开发时间投到热点代码里面比较实惠。
【 在 milksea (肥了,又肥了 >>>_<<<) 的大作中提到: 】
: 某些时候可以用unique_ptr
--
FROM 125.78.66.*