Re: C++ Threads, what's the status quo?
"Jeff Koftinoff" <jeff.koftinoff@gmail.com> wrote in message
news:1168894217.664801.296830@51g2000cwl.googlegroups.com...
JohnQ wrote:
template<class T>
Volatile
{
LockHandle my_lock;
T my_data;
public:
.
.
.
Volatile<T>& operator=(const T& a)
{
AutoLock lock(my_lock); // AutoLock is a mutex wrapper class
if(this != &a)
{
my_data = a;
}
return *this;
}
};
Volatile<int> x; // global x
void set_volatile_global_var(int a) // func called by multiple threads
{
x = a; // synchronized operation on the data
}
Three problems:
#1. Your lock is private
So?
#2. The lock is only used when my_data is set via operator =.
Given the above, it's not too big of a stretch of the imagination to get to
a locking smart ptr: lock when the smart ptr gets the Volatile and release
when the smart ptr goes out of scope.
#3. There is no other way to read or modify my_data
It was just meant to show some basic evolution point upon which to build
something useful.
Any accesses of my_data must be protected by the lock. If you added a
method to read my_data, even if that method performed the lock, if the
user wanted to read it, modify it, and then set it, then the user must
perform the lock. And it must be the same lock, otherwise you end up
with deadlock potentials. Furthermore, if this object was used in a
larger object which also needed a lock, then all the locks down the
line must be aquired in the proper order whenever any change occurs
Did you REALLY think the example was meant as a "ready to use as is class"?
Even with the ellipses in there? It's called "a quick hack".
John
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]