我目前正在尝试将单线程程序传递给多线程.该软件大量使用"refCounted"对象,这导致多线程中的一些问题.我正在寻找一些可能解决我的问题的设计模式.
主要问题是线程之间的对象删除,通常删除只减少引用计数,当refcount等于零时,则删除对象.这在monothread程序中运行良好,并且可以通过大对象的副本实现一些很好的性能提升.
但是,在多线程中,两个线程可能希望同时删除同一个对象,因为该对象受互斥锁保护,只有一个线程删除该对象并阻塞另一个.但是当它释放互斥锁时,另一个线程继续执行无效(释放对象),这会导致内存损坏.
以下是此类RefCountedObject的示例
class RefCountedObject
{
public:
RefCountedObject()
: _refCount( new U32(1) )
{}
RefCountedObject( const RefCountedObject& obj )
: _refCount( obj._refCount )
{
ACE_Guard< ACE_Mutex > guard( _refCountMutex );
++(*_refCount);
}
~RefCountedObject()
{
Destroy();
}
RefCountedObject& operator=( const RefCountedObject& obj )
{
if( this != &obj )
{
Destroy();
ACE_Guard< ACE_Mutex > guard( _refCountMutex );
_refCount = obj._refCount;
++(*_refCount);
}
return *this;
}
private:
void Destroy()
{
ACE_Guard< ACE_Mutex > guard( _refCountMutex ); // thread2 are waiting here …Run Code Online (Sandbox Code Playgroud) 我们正在评估HDF5在分块数据集方面的表现.特别是我们试图弄清楚是否有可能读取不同的连续块以及如何影响性能?例如,我们有一个块大小为10的数据集,一个包含100个值的数据集,并希望读取值23到48.是否会有很大的性能损失?
非常感谢!
我正在寻找一种方法来查找堆和拥有堆的模块之间的映射.我通过以下方式检索堆:
HANDLE heaps[1025];
DWORD nheaps = GetProcessHeaps((sizeof(heaps) / sizeof(HANDLE)) - 1, heaps);
for (DWORD i = 0; i < nheaps; ++i) {
// find module which created for heap
// ...
}
Run Code Online (Sandbox Code Playgroud)
我想要这样做的原因是,在我的应用程序中,我发现大约40堆,有些是标准堆,其他是低碎片堆.现在我想弄清楚哪个模块使用哪种堆.
非常感谢!