意义
使用线程的主要目的是实现多任务并发执行,提高程序的性能和响应能力。线程允许程序同时执行多个任务,可以将耗时的操作和需要并发处理的任务放在不同的线程中,从而提高程序的运行效率。
以下是一些使用线程的常见情况和好处:
-
并发处理:线程可以同时执行多个任务,使得程序能够同时处理多个事件或请求,提高系统的并发性能。
-
资源的同时访问:多个线程可以并发地访问共享资源,例如文件、数据库或网络连接,从而实现资源的高效利用。
-
提高程序的响应能力:通过将耗时的操作放在后台线程中执行,可以使主线程保持响应,提高用户体验。
-
并行处理:多线程可以在多个处理器或多核系统上并行执行任务,充分利用计算资源,提高程序的处理能力。
winnt.h
是Windows操作系统的头文件之一,其中定义了许多与Windows API相关的类型、宏和函数。_beginthreadex()
函数就是Windows API提供的一个线程创建函数,用于创建一个新的线程并立即开始执行指定的线程函数。
而<thread>
头文件是C++标准库中提供的用于线程操作的头文件,其中包含了std::thread
类的定义。std::thread
类是C++标准库中用于创建和管理线程的类,它提供了一些成员函数和操作符,用于创建线程并执行指定的线程函数。
两者的区别如下:
winnt.h
是Windows操作系统的头文件,用于使用Windows API提供的函数和类型进行系统级的操作。<thread>
是C++标准库的头文件,用于在C++程序中创建和管理线程。
在具体的开发中,可以根据需要选择使用哪种方式来创建和管理线程。如果是在Windows平台上开发,可以使用Windows API的函数来创建线程;如果是跨平台开发,可以使用C++标准库中的std::thread
类来创建线程。
采用winnt.h
一般情况下可以通过GetInstance()实例化对象后正式进入某一线程。如下进入Run()函数,
void Server::Run()
{
HANDLE hThread[1];
hThread[0] = (HANDLE)_beginthreadex(NULL, 0, ServerThread, this, 0, NULL);
}
在这段代码中,使用了Windows API的函数_beginthreadex()
来创建一个新的线程来执行ServerThread
函数。
具体解释如下:
-
HANDLE hThread[1];
:定义了一个名为hThread
的HANDLE
类型的数组,用于存储线程的句柄。 -
hThread[0] = (HANDLE)_beginthreadex(NULL, 0, TcpServerThread, this, 0, NULL);
:调用_beginthreadex()
函数创建一个新的线程,并将线程句柄存储在hThread[0]
中。_beginthreadex()
函数是Windows API的一个线程创建函数,它用于创建一个新的线程并立即开始执行。具体参数解释:NULL
:表示线程标识符,用于获取线程的ID,这里不使用。0
:表示线程运行时的创建选项,默认为0。this
:表示将当前对象的指针作为参数传递给线程函数。ServerThread
:表示要执行的线程函数,这个函数在后面的代码中应该有定义。0
:表示使用默认的线程堆栈大小。NULL
:表示使用默认的线程安全属性。
-
通过以上代码,一个新的线程就被创建并开始执行
TcpServerThread
函数。
需要注意的是,该代码片段中只创建了一个线程,因为hThread
数组只有一个元素。如果需要创建多个线程,可以将hThread
定义为具有多个元素的数组,并在循环中使用_beginthreadex()
函数创建多个线程。另外,使用完线程后,还需要适当地释放线程资源,例如在适当的地方调用CloseHandle()
函数关闭句柄。
那我们再来看看要执行的线程函数ServerThread()
unsigned int __stdcall ServerThread(PVOID arg)
{
Server * pThread = (Server *)arg;
pThread->Communicate();
return 0;
}
具体解释如下:
-
unsigned int __stdcall ServerThread(PVOID arg)
:定义了一个名为ServerThread
的函数,返回类型为unsigned int
,参数类型为PVOID
(即void*
)。__stdcall
是一种调用约定,用于指定函数参数的传递方式和堆栈的清理方式。在Windows平台上,线程函数通常使用__stdcall
调用约定。 -
Server * pThread = (Server *)arg;
:将传递给线程函数的参数arg
强制转换为Server*
类型,并将其赋值给名为pThread
的局部变量。这里传入的参数arg在上面_beginthreadex()
函数已经提到,是this
这个参数表示将当前对象的指针作为参数传递给线程函数。 -
pThread->Communicate();
:通过pThread
指针调用Server
类的Communicate()
方法。 -
return 0;
:返回0,表示线程执行完毕。
本文待续