小编Rob*_*yce的帖子

多线程链表遍历

给定(双重)链接的对象列表(C++),我有一个我想要多线程的操作,以对每个对象执行.每个对象的操作成本不均匀.由于各种原因,链表是这组对象的首选存储.每个对象中的第一个元素是指向下一个对象的指针; 第二个元素是列表中的上一个对象.

我通过构建节点数组并应用OpenMP解决了这个问题.这给了不错的表现.然后我切换到我自己的线程例程(基于Windows原语)并使用InterlockedIncrement()(作用于数组的索引),我可以实现更高的整体CPU利用率和更快的吞吐量.从本质上讲,线程沿着元素"跳跃式"运行.

我的下一个优化方法是尝试消除创建/重用链表中的元素数组.但是,我想继续这种"跳跃式"方法,并以某种方式使用一些不存在的例程,可称为"InterlockedCompareDereference" - 以原子方式比较NULL(列表末尾)和有条件地取消引用和存储,返回解除引用的值.

我不认为InterlockedCompareExchangePointer()会工作,因为我无法原子地取消引用指针并调用此Interlocked()方法.我做了一些阅读,其他人正在建议关键部分或自旋锁.关键部分在这里似乎很重要.我很想尝试旋转锁,但我想我首先在这里提出问题并询问其他人在做什么.我不相信InterlockedCompareExchangePointer()方法本身可以像旋转锁一样使用.然后还必须考虑获取/发布/围栏语义......

想法?谢谢!

c++ linked-list list

5
推荐指数
1
解决办法
922
查看次数

显式模板实例化:MSVC与GCC

我正在尝试用C++处理命名空间和模板.我可以得到以下代码在MSVC中编译(没有警告或错误),但我没有运气与CYGWIN/GCC的各种排列.任何帮助,将不胜感激.

在头文件中,我声明了一个模板化的子类,如下所示:

#include <gdal.h>
namespace sfms {

template <class _type, GDALDataType _gdal> class SmfsGrid_Typed : public SfmsGrid_Base {
public:
  SmfsGrid_Typed();
  SmfsGrid_Typed(const SmfsGrid_Typed<_type, _gdal> *toCopy);
  SmfsGrid_Typed(std::string filename);
  virtual ~SmfsGrid_Typed();
  virtual bool OpenRead();
  virtual bool OpenWrite();

protected:
  _type m_nodata_value;

  virtual SfmsGrid_Base *New() const;
  virtual SfmsGrid_Base *New(SfmsGrid_Base *toCopy) const;
  virtual void initCopy(SfmsGrid_Base *copy) const;
};

template SmfsGrid_Typed<double, GDT_Float64>;
template SmfsGrid_Typed<float, GDT_Float32>;
template SmfsGrid_Typed<int, GDT_Int32>;

typedef SmfsGrid_Typed<double, GDT_Float64> SmfsGrid_Double;
typedef SmfsGrid_Typed<float, GDT_Float32> SmfsGrid_Float;
typedef SmfsGrid_Typed<int, GDT_Int32> SmfsGrid_Int;
}
Run Code Online (Sandbox Code Playgroud)

在源文件中,我实例化专用模板类,如下所示:

void hi_there() {
//...
sfms::SmfsGrid_Typed<int, …
Run Code Online (Sandbox Code Playgroud)

c++ templates explicit instantiation

5
推荐指数
1
解决办法
697
查看次数

基于模板值的条件编译?

提出的问题: 在模板中键入条件

非常相似,但原始问题并未得到完全回答。

#include "stdafx.h"
#include <type_traits>


class AA {
public:
    double a;

    double Plus(AA &b) {
        return a + b.a;
    }
};

template<class T> double doit(T &t) {
    if (std::is_same<T, AA>::value)
        return t.Plus(t);
    else
        return t + t;
}

int _tmain(int argc, _TCHAR* argv[])
{
    double a;
    AA aa;

    doit(a);
    doit(aa);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这不会编译,我也没有期望。这样的事情可能吗?基于模板值,我希望一些代码可以编译,而其他则不需要。在这里,“ double”没有称为“ Plus”的方法,而“ AA”类不会覆盖“ +”运算符。考虑操作的细微语义时,操作符重载并不总是可取的,因此我正在寻找一种替代方法。我宁愿进行#ifdef的工作(如参考问题中所述的进行真正的条件编译),但要基于模板值。

c++ templates

5
推荐指数
3
解决办法
3501
查看次数

标签 统计

c++ ×3

templates ×2

explicit ×1

instantiation ×1

linked-list ×1

list ×1