ASIO 기반 C++ 프로그래밍
변하지 않을 C++도 세월의 흐름에 맞추는 것인지 몰라도 업데이트가 화려하다. 몇가지 개발하면서 삽질한 부분에 대해 정리
enable_shared_from_this
이넘때문에 아까운 시간을 허비했네… 결론적으로 사용하는 클래스가 enable_shared_from_this를 상속했다면,
//this <- 이걸로 함수 bind하면 새로 인스턴스가 생긴다.
this->enable_shared_from_this(); // 이게 정석
boost관련 문서를 많이 살펴보는 것이 필요하다.
lockless queue 만들기
멀티 쓰레딩은 해야겠고, mutex는 쓰기 싫고 해서 고민하고 있었더니 이미 boost예제까지 존재~~ :) 반나절 돌려 보는데 괜찮음.
#include <boost/atomic.hpp>
template<typename T, size_t Size>
class ringbuffer {
public:
ringbuffer() : head_(0), tail_(0) {}
bool push(const T & value)
{
size_t head = head_.load(boost::memory_order_relaxed);
size_t next_head = next(head);
if (next_head == tail_.load(boost::memory_order_acquire))
return false;
ring_[head] = value;
head_.store(next_head, boost::memory_order_release);
return true;
}
bool pop(T & value)
{
size_t tail = tail_.load(boost::memory_order_relaxed);
if (tail == head_.load(boost::memory_order_acquire))
return false;
value = ring_[tail];
tail_.store(next(tail), boost::memory_order_release);
return true;
}
private:
size_t next(size_t current)
{
return (current + 1) % Size;
}
T ring_[Size];
boost::atomic<size_t> head_, tail_;
};