RAD Studio
ContentsIndex
PreviousUpNext
_beginthread

Header File 

process.h  

Category 

Process Control Routines 

Prototype 

unsigned long _beginthread(void (_USERENTRY *__start)(void *), unsigned __stksize, void *__arg); 

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 function should terminate by simply returning; the _endthread. function will be called automatically. The _endthread function will automatically close the handle, and set the return value of the thread to zero. 

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 runtime library functions. 

This function is available only in the multithread libraries. 

Return Value 

_beginthread returns the handle of the new thread. The return value is a standard Windows handle that can be used in operating system API's such as SuspendThread and ResumeThread. 

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 stack size (i.e. less than 16 bytes, or equal to zero) 
ENOMEM 
Not enough memory 

Also see the description of the Win32 API GetLastError, in the MSDN Library. 

Example  

/*  Use the -tWM  (32-bit multi-threaded target) command-line switch for this example  */
#include <stdio.h>
#include <errno.h>
#include <stddef.h>     /* _threadid variable */
#include <process.h>    /* _beginthread, _endthread */
#include <time.h>       /* time, _ctime */
void thread_code(void *threadno)
{
    time_t t;
    time(&t);
    printf("Executing thread number %d, ID = %d, time = %s\n",
        (int)threadno, _threadid, ctime(&t));
    
}
    
void start_thread(int i)
{
    int thread_id;
#if     defined(__WIN32__)    
    if ((thread_id = _beginthread(thread_code,4096,(void *)i)) == (unsigned long)-1)
#else
    if ((thread_id = _beginthread(thread_code,4096,(void *)i)) == -1)
#endif
    {
        printf("Unable to create thread %d, errno = %d\n",i,errno);
        return;
    }
    printf("Created thread %d, ID = %ld\n",i,thread_id);
}
int main(void)
{
    int i;
    for (i = 1; i < 20; i++)
        start_thread(i);
    printf("Hit ENTER to exit main thread.\n");
    getchar();
    return 0;
}

Portability

POSIX 
Win32 
ANSI C 
ANSI C++ 
 
 
 
Copyright(C) 2009 Embarcadero Technologies, Inc. All Rights Reserved.
What do you think about this topic? Send feedback!