Re: Re-creating free threaded objects in the face of multiple threads
"Dilip" <rdilipk@lycos.com> wrote in message
news:1173746010.995680.192910@v33g2000cwv.googlegroups.com
On Mar 12, 6:16 pm, "Igor Tandetnik" <itandet...@mvps.org> wrote:
Try something like this:
void CallCOMWrapperMethod()
{
for (;;) {
IOne* pCopy = pOne_;
HRESULT hr = pCopy->CallThisMethod();
if (SUCCEEDED(hr)) break;
// We may need to recreate the object
Lock();
if (pCopy == pOne_) {
ReleaseIOne();
CreateIOne();
} // otherwise, somebody else beat us to it.
Unlock();
}
}
Igor
Thanks for the suggestion.
Since you are comparing pointer values, is there a chance CreateIOne()
inside the Lock() can somehow return the same allocated address again?
Yes, I guess it's possible. Just do CreateIOne(); ReleaseIOne(); then,
in this order.
Actually, now that I think of it, the whole idea is not going to work.
It is possible for one thread to release and destroy the object, just as
another is calling a method on it.
This should be safe, but requires locking for the normal case:
void CallCOMWrapperMethod()
{
for (;;) {
IOne* pCopy = 0;
Lock();
pCopy = pOne_;
pCopy->AddRef();
Unlock();
HRESULT hr = pCopy->CallThisMethod();
Lock();
pCopy->Release();
if (FAILED(hr) && pCopy == pOne_) {
// We need to recreate the object
CreateIOne();
ReleaseIOne();
}
Unlock();
if (SUCCEEDED(hr)) break;
}
}
To make it completely lock free (or at least lock free on the success
path) would require hazard pointers technique:
http://en.wikipedia.org/wiki/Hazard_pointer
http://www.research.ibm.com/people/m/michael/ieeetpds-2004.pdf
It's very elaborate.
--
With best wishes,
Igor Tandetnik
With sufficient thrust, pigs fly just fine. However, this is not
necessarily a good idea. It is hard to be sure where they are going to
land, and it could be dangerous sitting under them as they fly
overhead. -- RFC 1925