9 Nov 2006 (updated 9 Nov 2006 at 21:45 UTC)
»
robogato
I was one who pushed phpgurru over the spam threshold. It's a shame
his last
diary post was lost, because that's what convinced me he was a spammer. He
said something about knowing a guy who will provide you content for your
website so you get more AdWords money or something, and linked to the
guy's spammy website.
ncm, C++ thread cancellation
That's interesting! But I bet against you - they'll fail. I'd say pthread
cancellation has six problems that Java's interrupt() does not:
- widely inconsistent, broken implementations [1]
- it's a C standard that proposes a C++ way (exception stacks) rather than
a C way (ECANCELED)
- inability to pass through language boundaries, like through the Python
interpreter
- not reversible [2], making it worthless for canceling a
single task in a long-running worker thread
- allows what I describe in the sigsafe
documentation
as the "after race" [3]
. The standard says: [4]
... if the thread is suspended at a cancellation point and the event for which
it is waiting occurs before the cancellation request is acted upon, it is
unspecified whether the cancellation request is acted upon or whether the
cancellation request remains pending and the thread resumes normal
execution.
- (for the people who implemented it via a C++ exception) crashes if
cancellation happens in a destructor while an exception is being handled.
(close(2) is a cancellation point, so this is likely! The solution I've
seen is for the user to always disable cancellation before calling it in
this case, but they won't. It'll just crash.)
The C++ people will probably avoid #2, #3, and #4; and introduce #7:
- no standard way of signaling cancellation to underlying C code
that makes blocking system calls
Given that most everyone using C++ wraps some third-party C library
or
makes some direct system call, I think #7 is particularly important. C++ just
can't pull it off without C. The pthread situation needs to be fixed first. #2
just can't be, short of them admitting they screwed up, ditching it,
apologizing to everyone who tried to use it, and going with
ECANCELED. I'd be just a tiny bit surprised to see a standards body
do such a thing...
I think the screwed-up pthread cancellation is a consequence of
premature
standardization. After working with DSL Forum (worst standards body ever), I'm quite
familiar with the problem. They stamped approval on a cool new thing before
there were three useful, compatible implementations, so the problems
weren't discovered until it was too late to change them.
So what hope is there for people who want to use cancellation? Well, you
can
easily build it on top of sigsafe. Unfortunately, sigsafe's only practical for
people who make direct system calls (e.g., people who write servers instead
of gtk-based GUI clients), and you either need to (1) port it to each platform
you will use (takes me a few hours for each) or (2) have a "correct" path and a
"racey but portable" path.
I think portability is overrated - everyone should use new versions of
Linux,
FreeBSD, or (maybe) OS X. Trying to port to old versions or to a million
different systems is a colossal waste of time. [5] But my view is unpopular; thus
the lack of major applications using sigsafe.