- 论坛徽章:
- 9
|
本帖最后由 wlmqgzm 于 2016-05-26 15:51 编辑
回复 61# windoze
正如你指出的 Boost.lockfree要求T满足......., 很多条件, 那么就是说: 不是任意对象. 很多情况下无法使用Boost.lockfree,
任意对象的Lock_free_queue 更容易满足编程的要求.
早期代码也是考虑不放shared_ptr, 只使用裸指针( 来自shared_ptr.get() ), 简洁优雅, 功能是一样的,代码效率还要高, 性能也更好,
但是实际在使用中, 这个Lock_free_queue的缺点就是生产者必须要保证长时间持有shared_ptr,不能释放shared_ptr, 否则,消费者有可能会处理已经失效的内存空间,造成系统崩溃,
那么高层代码的复杂度和耦合度就都增加了, 高层代码无法实现Fire and forget 发送后就不管了,
考虑了几个常用场合, 觉得这样的实现对编程人员的要求更高, 对高层代码的限制也更多, 线程代码也无法或者很难做到完全隔离, 并且高层代码增加的行数也更多,更容易出现各种问题,
所以, 有理由实现一个更智能化,更自动化的无锁队列, 实质就是将shared_ptr临时保存一下, 在pop以后的恰当时机再释放. 生产者实现Fire and forget 发送后就不管了
pop得到的是保证安全的裸指针, pop也不用关心指针的内存释放问题.
封装以后, 实现 更安全, 更简洁, 更能适应一切场合,一切对象的代码, 对高并发编程带来的好处是很多的, 它克服了无锁队列的限制条件和安全要求.
template<typename T, unsigned int N=WAIT_FREE_SPSC_QUEUE_DEFAULT_SIZE>
class Wait_free_spsc_queue
{
public:
Wait_free_spsc_queue( void );
bool push( std::shared_ptr<T> sp_in );
T* pop( void );
unsigned int size( void );
bool empty( void );
bool full( void );
bool is_lock_free( void );
|
|