//---------------------------------------------------------------------------
#include <vcl.h>
#include <stdio.h>
#include <errno.h>
#include <stddef.h> /* _threadid variable */
#include <process.h> /* _beginthread, _endthread */
#include <time.h> /* time, _ctime */
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused
//线程回调函数
void thread_code(void *threadno)
{
time_t t;
time(&t);
printf("线程回调函数==>线程创建序号:%d,线程ID:%d, 创建时间:%s\n",
(int)threadno, _threadid, ctime(&t));
//_endthread();//此函数会被自动调用。
}
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("不能创建线程:%d, errno = %d\n",i,errno);
return;
}
//如果需要的话,可以用此函数使线程休眠
//::SuspendThread((void*)thread_id);
printf("创建线程成功: %d,线程句柄:ID = %ld\n",i,thread_id);
}
int main(int argc, char* argv[])
{
int i;
getchar();//等待一下,在任务管理器中,查看线程创建前后变化
for (i = 0; i < 10; i++)
start_thread(i);
printf("回车退出主线程.\n");
getchar();
return 0;
}
(1)_beginthread在线程结束时,会自动调用_endthread函数。在回调函数中显式调用也不会出错。
(2)_beginthread函数创建成功时,返回线程句柄。此句柄可被SuspendThread 和 ResumeThread函数调用。
(3)_beginthread调用出错时,返回的是-1,同时会将具体错误类型存放到全局的errno中,可以GetLastError函数查看。一般会有以下几种情况:
EAGAIN 线程过多
EINVAL 非法栈内存 (至少大于16或者为0)
ENOMEM 没有足够内存
(4)线程回调函数无返回值。