[vdr] Thread start functions and external C linkage (VDR starts
it's threads "incorrectly")
Klaus Schmidinger
Klaus.Schmidinger at cadsoft.de
Sun Feb 12 12:16:13 CET 2006
Sascha Volkenandt wrote:
> Hi everyone, hi Klaus,
>
> while discussing a paper about multithreading with pthreads, some people
> pointed out that it is not legal regarding standard C++ when using a static
> member of a class as a thread start function.
>
> The reason is that a thread start function handed to pthread_create MUST have
> external C linkage, which is not guaranteed to be the case with static
> members. In fact, many compilers declare such members with the same calling
> conventions that an extern "C" function uses, but the standard doesn't
> require this. Indeed, there are (according to external informations)
> compilers that act differently here.
>
> To fulfill the requirements of the standard, VDR's thread start function
> should have the following signature:
>
> extern "C" void *StartThread(cThread *Thread);
>
> class cThread {
> friend void *StartThread(cThread *Thread);
> /* ... */
> };
This would allow anybody to do
cThread t;
StartThread(&t);
which I don't think would be a good thing to do.
Any ideas how to prevent this from happening?
Klaus
> Don't get me wrong, this is not a problem with current gcc versions, but...
> Since the standard doesn't require gcc to behave the way it does, future
> changes to the ABI could affect this region and could render current code
> unfunctional...
>
> Even worse, some implementations of pthread lack a construct that declares the
> members of pthread.h extern "C" when compiled in C++ mode. (But this won't be
> a problem here I guess, since I suppose VDR won't run on AIX, so, just for
> the record).
More information about the vdr
mailing list