给定(双重)链接的对象列表(C++),我有一个我想要多线程的操作,以对每个对象执行.每个对象的操作成本不均匀.由于各种原因,链表是这组对象的首选存储.每个对象中的第一个元素是指向下一个对象的指针; 第二个元素是列表中的上一个对象.
我通过构建节点数组并应用OpenMP解决了这个问题.这给了不错的表现.然后我切换到我自己的线程例程(基于Windows原语)并使用InterlockedIncrement()(作用于数组的索引),我可以实现更高的整体CPU利用率和更快的吞吐量.从本质上讲,线程沿着元素"跳跃式"运行.
我的下一个优化方法是尝试消除创建/重用链表中的元素数组.但是,我想继续这种"跳跃式"方法,并以某种方式使用一些不存在的例程,可称为"InterlockedCompareDereference" - 以原子方式比较NULL(列表末尾)和有条件地取消引用和存储,返回解除引用的值.
我不认为InterlockedCompareExchangePointer()会工作,因为我无法原子地取消引用指针并调用此Interlocked()方法.我做了一些阅读,其他人正在建议关键部分或自旋锁.关键部分在这里似乎很重要.我很想尝试旋转锁,但我想我首先在这里提出问题并询问其他人在做什么.我不相信InterlockedCompareExchangePointer()方法本身可以像旋转锁一样使用.然后还必须考虑获取/发布/围栏语义......
想法?谢谢!
我正在尝试用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) 提出的问题: 在模板中键入条件
非常相似,但原始问题并未得到完全回答。
#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的工作(如参考问题中所述的进行真正的条件编译),但要基于模板值。