Well, he did not point out anything but claimed something. He has
postings that he used to correct the next hour or the next day.
The pseudo-code I post over on 'comp.programming.threads' is all about the
__experimental__ synchronization algorihtms that I am brainstorming. We have
been over this before Szabolcs. If I come up with an idea, I try to make
sure to post it on c.p.t. If there is a typo in the pseudo-code, I promptly
document them and show the corrections. Anyway...
You better read carefully what I have written. I highlighted that one
needs discipline for it. It is hopless for you but at least you calm
down.
I hope I could help though.
Unfortunately, wrt this thread, your so-called help is only going to lead
the OP down the wrong path. You don't seem to get it. AFAICT, the OP wanted
to create a thread base class for users to derive from. Something like:
____________________________________________________________________
class thread_base {
pthread_t m_tid;
virtual void on_entry() = 0;
thread_base() {
}
virtual ~thread_base() throw() = 0;
};
thread_base::~thread_base() throw() {}
____________________________________________________________________
The OP cannot start the thread from the constructor of the base class! This
is what I was referring to. When threads are involved there is a major
race-condition because the thread can be started and call the on_entry pure
virtual function which results in UB. Also, even in the absence of threads
there still can be a problem. Here is a VERY simple example:
____________________________________________________________________
#include <cstdio>
#include <cstdlib>
static void call_abstract_virtual_indirect(class base*);
class base {
friend void call_abstract_virtual_indirect(class base*);
virtual void on_action() = 0;
public:
base() {
call_abstract_virtual_indirect(this);
}
virtual ~base() throw() = 0;
};
base::~base() throw() {}
void call_abstract_virtual_indirect(base* _this) {
_this->on_action();
}
class derived : public base {
int const m_ctor;
public:
derived() : m_ctor(123456789) {
}
private:
void on_action() {
std:
rintf("(%p)::derived:
n_action()\n", (void*)this);
if (m_ctor != 123456789) {
std:
rintf("(%p)::derived:
n_action() - NOT CONSTRUCTED!\n",
(void*)this);
std::getchar();
std::abort();
}
}
};
int main() {
{
derived d;
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
std:
uts("\n\n____________________________________________\n\
Press <ENTER> to exit...");
std::getchar();
return 0;
}
____________________________________________________________________
The above demonstrates one reason why its generally NOT a good idea to start
a thread in a constructor. Your failure to understand this is only going to
confuse the OP. Your advise is flawed in that respect. The problem produces
undefined-behavior. It can just seg-fault, or it might print "... NOT
CONSTRUCTED!", or whatever. Therefore, I guess the moral of the story is "Do
NOT call abstract virtual functions in constructors!"
:^o