c# - 在C++中实现锁

标签 c# c++ locking type-constraints

抱歉,这个问题的问题可能有点模糊。我正在尝试将此 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/

相关文章:

c# - 在 C# 中通过驱动类 B 对象访问基类 A 函数

c++ - 检查静态库是否定义了所有符号

c++ - 为什么 C++ rand() 似乎只生成相同数量级的数字?

java - 如何在没有 volatile 的情况下打破双重检查锁定

c# - 锁与比较和交换

c# - Unity - 检查播放器是否接地不工作

c# - 系统.绘图.图形

c# - 如何实现不将响应封装在 XML 中的 .Net WebService?

c++ - 如何给命名空间起别名并根据别名扩展原来的命名空间

java - wait() 如何在 Java 中取回锁