このコードはうまくいくようですが、InterlockedIncrement関数を正しく使用しましたか? m_countの正しいメモリアラインメントが私の主な関心事です。私たちがx86-64システムを使い、64ビットアプリケーションをコンパイルするとします(問題の場合)。ちなみに私の実際の目的では、m_countを揮発性の長いものとして宣言することはできず、次にInterlockedIncrement(& m_count)を使用します。ヒープ内のデータへのポインタでなければなりません。InterlockedIncrement関数の正しいメモリ配置でヒープから割り当てる方法は?
#include <Windows.h>
#include <malloc.h>
class ThreadSafeCounter {
public:
ThreadSafeCounter()
{
// Are those arguments for size and alignment correct?
void* placement = _aligned_malloc(sizeof(long), sizeof(long));
m_count = new (placement) long(0);
}
~ThreadSafeCounter()
{
_aligned_free(const_cast<long*>(m_count));
}
void AddOne()
{
InterlockedIncrement(m_count);
}
long GetCount()
{
return *m_count;
}
private:
volatile long* m_count;
};
なぜヒープ上にある必要がありますか? _aligned_mallocを使用したいからですか?とにかく_aligned_mallocはコンパイラの拡張機能ですので、GCCコンパイラとMSVCコンパイラで使用可能な#pragma packディレクティブを使用して、整列要件を満たすことができます。また、GCCとMSVCのデフォルトのプラグマパッキングは、インターロックされた操作の基本的なアラインメント要件を既に満たしています。だからあなたは本当にこの問題を考え過ぎているようです。 –
このThreadSafeCounterクラスは、単なる単なる例です。私が実際にやっていることは、std :: shared_ptrのようなものですが、いくつかの追加機能があり、そのためにヒープにカウンタを置く必要があります。 – zeroes00
カウンタはヒープ上にあることができますが、どのようにそれをやっているのかを割り当てる必要はありません。もしstd :: shared_ptrのようなものであれば、クラス内でインライン化され、整列されていれば_align_mallocが実行されます)パフォーマンスを落とし、b)ロックフリーの環境で問題を引き起こす可能性がある独自のロックセクションにあなたを押しつける – Necrolis