码迷,mamicode.com
首页 > 编程语言 > 详细

在不使用显式锁的方式下使用多线程

时间:2016-03-13 00:44:12      阅读:251      评论:0      收藏:0      [点我收藏+]

标签:

一个串被定义为序列的调用事件句柄(非并行调用),使用串允许在多线程环境中执行代码而不使用显示的互斥锁。
串可以是隐式的或者显式的,如下方的可替代方法所示:
仅在一个线程中调用io_service::run()意味着使用隐式的串执行所有的事件句柄,因为io_service确保了句柄只被run()内部调用。
当有一个只和一个连接关联的异步操作链时(比如半双工的协议HTTP),不可能并发的执行句柄,这是一个隐式的串。
显式的串调用是一个io_service::strand的实例,所有的事件句柄函数需要使用io_service::strand::wrap()包装,或者通过io_service::strand对象进行通告、发送。
如果是异步操作,比如async_read()或者async_read_until(),如果一个完成句柄通过一个strand,所有其他的中间句柄也都需要通过同一个串,这是为了保证在调用者和完成操作之间共享的对象的线程安全(在async_read() 的情况下是socket,调用者可以通过close来关闭操作),这是通过给所有指向同最终句柄关联的自定义句柄的中间对象嵌入hook函数来完成的。
struct my_handler
{
  void operator()() { ... }
};
template<class F>
void asio_handler_invoke(F f, my_handler*)
{
  // Do custom invocation here.
  // Default implementation calls f();
}
  
io_service::strand::wrap() 创建了一个定义了 asio_handler_invoke 的新完成句柄,以便函数对象通过strand来执行。
串的英文为strand。

在不使用显式锁的方式下使用多线程

标签:

原文地址:http://www.cnblogs.com/learn-my-life/p/5270908.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!