On the subtleties of using _beginthread to implement fork

vischne@ibm.net vischne@ibm.net
Wed Nov 12 18:03:00 GMT 1997


Some beginning programmer wrote to me that _beginthread was not suitable
for a fork() implementation because it  supposedly uses the `same data
segment' as its parent process.  Without discussing the subtleties of
calling GlobalAlloc(), or even its disguised sibling, malloc(), I present
a description of _beginthread():


#include <process.h>
unsigned long _beginthread(_USERENTRY (*start_address)(void *), unsigned
stack_size, void *arglist)

Description

Starts execution of a new thread.

Note:	The start_address must be declared to be _USERENTRY. 

The _beginthread function creates and starts a new thread. The thread
starts execution at start_address. 

The size of its stack in bytes is stack_size; the stack is allocated by
the operating system after the stack size is rounded up to the next
multiple of 4096. The thread is passed arglist as its only parameter; it
can be NULL, but must be present. The thread terminates by simply
returning, or by calling _endthread.

Either this function or _beginthreadNT must be used instead of the
operating system thread-creation API function because _beginthread and
_beginthreadNT perform initialization required for correct operation of
the run-time library functions.

This function is available only in the multithread libraries.

Return Value

_beginthread returns the handle of the new thread. 
On error, the function returns -1, and the global variable errno is set to
one of the following values:

EAGAIN	Too many threads
EINVAL	Invalid request



-
For help on using this list (especially unsubscribing), send a message to
"gnu-win32-request@cygnus.com" with one line of text: "help".



More information about the Cygwin mailing list