抱歉,这个问题的问题可能有点模糊。我正在尝试将此 ObjectPool 代码从 C# 移植到 C++,但似乎有些部分我不知道应该如何进行。代码如下:
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) 我应该如何在 C++ 中实现泛型参数 T 的约束? (类,新())
2)互斥锁部分有没有简单的实现方式?
3) 在 C++ 中将 _pool 定义为 vector 而不是 T[] 会更有效吗?
编辑 -> 实现如下:
#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);
}
想知道这段代码是否有问题...
最佳答案
1) How should I implement that constraint on generic parameter T in C++? (class, new())
一般情况下,不要。如果不满足约束条件,将无法编译。很简单。有一些巧妙的方法可以获得更好的错误消息,但我已经忘记了它们,因为我从来没有费心过。
2) Is there a simple way to implement the mutex lock part?
使用 boost::mutex .
3) Will it be more efficient to define _pool as vector instead of T[] in C++?
考虑到您不能拥有没有大小的本地 T[]
,是的。使用 std::vector
。 (您可以将它作为参数,但不能在变量定义中。)
关于c# - 在C++中实现锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8173915/