Извините, что вопрос этой проблемы может быть немного расплывчатым. Я пытаюсь перенести этот код ObjectPool с С# на С++, но, похоже, есть некоторые части, в которых я не знаю, как мне действовать. Коды следующие:
using System;
namespace FastRank
{
public class ObjectPool<T> where T : class, new()
{
private int _count;
private T[] _pool;
public ObjectPool(int initSize)
{
_pool = new T[initSize];
}
public T Get()
{
lock (_pool)
{
if (_count > 0)
{
--_count;
T item = _pool[_count];
_pool[_count] = null;
return item;
}
}
return new T();
}
public void Return(T item)
{
lock (_pool)
{
if (_count == _pool.Length)
Array.Resize(ref _pool, _pool.Length*2 + 1);
_pool[_count++] = item;
}
}
}
}
Мои вопросы:
1) Как мне реализовать это ограничение на общий параметр T в С++? (класс, новый())
2) Есть ли простой способ реализовать блокировку мьютекса?
3) Будет ли более эффективно определять _pool как вектор вместо T[] в C++?
edit -> Реализовано что-то вроде:
#include "object_pool.h"
#include <boost/thread.hpp>
#include <vector>
using namespace std;
template <class T>
ObjectPool<T>::ObjectPool(int init_size) {
pool_.reserve(init_size);
}
template <class T>
T ObjectPool<T>::Get() {
boost::lock_guard<boost::mutex> lock(guard_);
int sz = (int) pool_.size();
if (sz == 0) {
throw "Object pool size is now zero.";
}
else {
T item = pool_[sz-1];
pool_.pop_back();
return item;
}
}
template <class T>
void ObjectPool<T>::Return(T item) {
boost::lock_guard<boost::mutex> lock(guard_);
pool_.push_back(item);
}
Интересно, есть ли проблемы с этим кодом...
<mutex>
; класс должен получить объект мьютекса-члена, и вы блокируете его во время операцийGet
иReturn
. - person Kerrek SB   schedule 18.11.2011