深入chromium中的多线程

 

Callback

绑定到一个函数上。

绑定到一个类成员函数上。

Bind

动态绑定参数。

这个局部绑定函数内部是根据重载函数实现的,所以参数的顺序是绑定的放在前面,定义MyFunc时,未绑定的参数放在后面。

WeakPtr可取消task。

参数包装函数

base::Unretained()。解除传递给base::Bind()的第一个参数类成员函数的类必须是引用计数类型的限制。但是你需要确保参数的生命周期必须持续到callback执行完成。

base::Owned()。把一个原始指针的管理器转移给base::Callback。TaskRunners关闭的时候不能保证callbacks会被执行,所以把管理器转移给Callback,可以防资源泄漏。

base::Passed()。传递scoped对象的给callback。base::Passed()需要scoped的参数类型,这样意味着callback只能执行一次。

base::ConstRef()。把参数当作const reference而不是复制给callback。

base::IgnoreResult()。传递给base::Bind()的函数指针使用忽略返回值。因为Closures是没有参数没有返回值的callback。

PostTask

建立3个线程。

MessageLoop执行task。

MessageLoopProxy执行task。

不要用BrowserThread::GetMessageLoop获得MessageLoop指针,不要保存这个指针以便于以后使用PostTask。这个指针接下来可能会失效。在chromium中尽可能的使用BrowserThread::PostTas,或者某些地方使用 scoped_refptr<MessageLoopProxy>。

如果想在别的线程执行一些逻辑然后在跳回原来的线程,请使用PostTaskAndReply。

PostTaskAndReply()确保两个task都会在它们创建的线程上销毁。

你可以使用PostTaskAndReplyWithResult从第一个task返回一个结果,传递到第二个task中。

 

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注