asio strand的优点及strand与mutex的比较
- void strand_service::do_post(implementation_type& impl,
- operation* op, bool is_continuation)
- {
- impl->mutex_.lock();
- if (impl->locked_)
- {
- // Some other handler already holds the strand lock. Enqueue for later.
- impl->waiting_queue_.push(op);
- impl->mutex_.unlock();
- }
- else
- {
- // The handler is acquiring the strand lock and so is responsible for
- // scheduling the strand.
- impl->locked_ = true;
- impl->mutex_.unlock();
- impl->ready_queue_.push(op);
- io_service_.post_immediate_completion(impl, is_continuation);
- }
- }
impl就是strand实现类, 内部还是有锁。
只不过锁的范围内没做什么事情, 检查状态 push/pop之类的; 尽量减少持有锁的时间, 通过这种方式来增强并发。
因为线程获取锁之后马上就释放了。 其他线程尝试获取锁时的争用情况大大减少了。 基本不会争用,更不可能会卡住。
但是直接用mutex, 就可能出现被卡住的情况。
只不过锁的范围内没做什么事情, 检查状态 push/pop之类的; 尽量减少持有锁的时间, 通过这种方式来增强并发。
因为线程获取锁之后马上就释放了。 其他线程尝试获取锁时的争用情况大大减少了。 基本不会争用,更不可能会卡住。
但是直接用mutex, 就可能出现被卡住的情况。