Re: How to rollback another stack in C++?
chengpu@gmail.com wrote:
Hi!
I am writing a thread-safe interface class <IThread> that exchange
messages in a multi-thread environment. Assume a thread is processing
a message in a function <IThread>::ProcMsg(), in two situations I need
to roll back this function's execution on another management thread:
(1) When it is in a infinitive loop. This can be detected by how much
time the function has been executing against a predefined timeout (say
10sec);
An infinitive loop .. is that something like:
while (true) cout << "to loop " ;
I guess if your iostream implementation isn't thread safe it would even
be possible to get a split infinitive loop.
(2) When the sender of the message is dead, such as when a socket
connection is lost, there is no point to continue working on the
request from that connection;
It is easy to have a <IThread>::RollbackMsg() corresponding to
<IThread>::ProcMsg() to get rid of the effect of processing the
message. It seems very hard to roll back the stack of the <IThread>
back to before the <IThread>::ProcMsg() is called, because C++ only
allows catch an exception on the same stack, and C's set-jump/long-jump
only works on the same stack also.
This kind of rolling back is very easy if you can access context switch
handler in many embedded systems. In fact, C++'s catch or C's set-jump
has all the information for the rolling back. Is there a way to
throw/catch an exception from another thread/stack? I just wonder if
there is an elegant way to do this rolling back in C++.
There is no standard way of doing what you want, as C++ has no
awareness of threads. The only ways to move back up a call stack are a
return statement, reaching the end of a function, or throwing an
exception.
It is likely though that your threading library provides a few tools
that may help. For example, some libraries allow threads to be
cancelled, or have signals delivered to them, either of which would
give you a way to change the behavior of one thread from another. If
you are using pthreads, you might look up pthread_cancel,
pthread_setcancelstate, pthread_setcanceltype, pthread_kill, etc.
--
Alan Johnson
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]