Windows API 多线程-学习笔记(一)

2 篇文章 0 订阅
2 篇文章 0 订阅
这篇博客是关于Windows API下多线程的创建和管理的学习笔记。介绍了使用CreateThread()和_CRT庫的_beginthread()、_beginthreadex()函数创建线程,并强调了当线程不再使用时,应通过CloseHandle()关闭线程句柄。同时提到了线程的结束函数 `_endthread()` 和 `_endthreadex()`,以及如何自然结束线程。
摘要由CSDN通过智能技术生成

Windows API 多线程-学习笔记(一)


一, winindows 下多线程的创建与撤销:

windows 下多线程创建函数有两种,一种是调用系统API: CreateThread(), 另一种是调用C运行时函数库_beginthread()或_beginthreadex(),创建线程如果不再使用


//函数原型:

//The thread object remains in the system until the thread has terminated and all handles to it have been closed through a call to CloseHandle.

//创建线程如果不再使用返回的线程句柄,应用CloseHandle关闭,

HANDLE WINAPI CreateThread(
  __in          LPSECURITY_ATTRIBUTES lpThreadAttributes, //安全类型, NULL时为默认安全类型 
                                                                                   //可以用SetThreadPriority或GetThreadPriority设定或获得
  __in          SIZE_T dwStackSize, //线程栈大小 NULL时为默认大小,好像是 1M
  __in          LPTHREAD_START_ROUTINE lpStartAddress, //线程函数地址
  __in          LPVOID lpParameter, //线程函数的参数,在些传给线程
  __in          DWORD dwCreationFlags, //线程创建标志 如果是CREATE_SUSPENDED 
                                                        //则线程创建时是暂停的,要用ResumeThread
                                                        //唤醒线程,如果是NULL则立即进入调度队列
                                                        //STACK_SIZE_PARAM_IS_A_RESERVATION与线程栈有关
 __out         LPDWORD lpThreadId //传入一个DWORD变量地址,获得线程ID,也可传NULL, 可以用GetThreadId获得线程ID
);
//结束一个线程, 可以自然的结束.
VOID WINAPI ExitThread(
  __in          DWORD dwExitCode
);
//线程函数模型, ThreadProc可以换成其它自定义的名称
DWORD WINAPI ThreadProc(
  [in]                 LPVOID lpParameter
);


//简单版 (最好不要用,)

uintptr_t _beginthread(
   void( *start_address )( void * ), //线程函数地址
   unsigned stack_size, //线程栈大小,
   void *arglist  //线程函数参数
);

// 与C Runtime Library 一起用时没问题(好像是使用了TLS,使原来的全局变量在每个线程中都有,)
uintptr_t _beginthreadex( //与CreateThread一样.
   void *security, //安全类型
   unsigned stack_size, //线程栈大小
   unsigned ( *start_address )( void * ), //线程函数地址
   void *arglist, //线程函数参数
   unsigned initflag, //线程标志
   unsigned *thrdaddr  //线程ID
);

//在线程函数中调用,结束调用的线程, 可以自然的结束.
 void _endthread( void );
void _endthreadex(
   unsigned retval //线程结束代码.
);
 




//例程(vc2008)

HANDLE h_thread;


DWORD ThreadProc(char* str)
{
    for (int i = 0; i != 10; i++)
    {
        printf("No. %d: %s\n", i, str);
        //std::cout << "NO." << i  << ": " << str << std::endl;
    }
    Sleep(5000);
    return 0;
}

void TestThread()
{
    DWORD thread_id;
    h_thread = CreateThread(
        NULL,
        NULL,
        (LPTHREAD_START_ROUTINE)ThreadProc,
        (LPVOID)"Test string passed to ThreadProc",
        NULL,
        &thread_id);

    for (int i = 0; i != 10; i++)
    {
        printf("No. %d: In the main thread.\n", i);
    }
    WaitForMultipleObjects(
        1,
        &h_thread,
        true,
        INFINITE);
    CloseHandle(h_thread);

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值