I've been doing some reading lately about threading (Posix threads) and I'm really curious about a couple things that I've read. I'm not sure if many people here have threading experience, but I thought it would be nice to be able to discuss some questions about it.
(For the record, I did search, and found tons of threads with "thread" in them for obvious reasons, refining my search to "posix thread" revealed very limited results - and one general thread that was from 2002 - similar searching for "multi thread" provided minimal results as well. Anyway, I just wanted you all to know that I searched before starting a somewhat general thread).
On to the questions:
1) I know that errno is thread safe when the _REENTRANT macro is defined...what about when it is not? I.E. I'm calling a library function from a library that wasn't compiled with the _REENTRANT macro, what errno value do those functions get? Always the errno from the first thread (this is what I'd hope such that a library can declare that it is safe if called from the primary thread).
2) I've seen functions re-written to be thread safe by doing their work in a local variable, then copying that local variable out to a user passed in storage area. What I wonder is, what about just using the user defined storage area directly? I.E. Why do they do this:
int func(struct f_struct *outBuf)
{
struct f_struct work;
/* set everything in work */
memcpy(outBuf, &work, sizeof(struct f_struct));
}
While it would seem just as appropriate to do the work directly in outBuf?
I would think that with large structures, the memcpy at the end would be more expensive than working with outBuf directly?
What I'm wondering is are both methods appropriate, and my literature only mentions their preference?
3) In general, it seems that an application using threads needs to link with the pthread library. Therefore, how do I provide both thread safe interfaces and standard interfaces in one library without requring an application to link with the pthread library. Obviously to call the functions that use pthread_ functions, I need that library. However, I'd prefer NOT to make a library dependant on the availabillity of a thread library. How do the standard libraries overcome this?
Anyway, I'm sure I'll have more questions...but that's all I can think of right now...off to read some more.