此代碼似乎工作,但我有沒有正確使用InterlockedIncrement函數? m_count的正確內存對齊是我最關心的問題。假設我們在一個x86-64系統上編譯一個64位應用程序(如果有的話)。順便說一句,對於我的實際目的,我不能將m_count聲明爲volatile,然後使用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上的默認編譯指南已經滿足了互鎖操作的基本對齊要求。所以你真的好像想到了這個問題。 – 2010-12-01 11:42:23