《C++ Concurrency in Action》笔记7 mutex(3)pop和top问题之方案

接着上一篇笔记,如何解决,top、pop问题。

方案一

让pop()以参数的形式返回一个引用。

std::vector<int> result;
some_stack.pop(result);

这种方案在大多数情况下都能正常工作。但是它有个严重的缺点,就是需要再调用pop前先构造一个值的实例。有时,这是不切实际的,因为这需要花费时间或资源。另一方面,这也不总是可行的,因为构造一个示例所需的参数在某个时间点有可能是无效的。最后,他要求实例类型是可赋值的,很多自定义类型并不支持赋值操作,

方案二

采用返回值拷贝的pop接口。并且保证stack中值类型保证在copy或move时不抛出异常。尽管可以通过std::is_nothrow_copy_constructible和std::is_nothrow_move_constructible来判断拷贝构造和移动构造函数是否抛出异常,但是那很有限。有很多自定义类型并不能保证这点。

方案三

采用返回指针的pop接口。优点是,可以轻松的拷贝一个指针,并且没有异常抛出。缺点是,需要一系列内存管理操作,对于简单的类型比如int,其开销甚至超过返回一个值拷贝。对于使用这种操作的接口,std::shared_ptr是一个不错的选择,既能避免使用new和delete,又能防止内存泄漏。但是,使用这种策略就要求stack中使用new申请内存,与方案二相比这将需要相当大的开销。

方案四

同时采用方案一和方案二(或者方案三)。如果你已经提供了方案二或者方案三,那么再增加方案一接口是很容易的事。这样,在使用时可以根据实际情况灵活运用。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值