如何在项目中使用线程

意义

使用线程的主要目的是实现多任务并发执行,提高程序的性能和响应能力。线程允许程序同时执行多个任务,可以将耗时的操作和需要并发处理的任务放在不同的线程中,从而提高程序的运行效率。

以下是一些使用线程的常见情况和好处:

  1. 并发处理:线程可以同时执行多个任务,使得程序能够同时处理多个事件或请求,提高系统的并发性能。

  2. 资源的同时访问:多个线程可以并发地访问共享资源,例如文件、数据库或网络连接,从而实现资源的高效利用。

  3. 提高程序的响应能力:通过将耗时的操作放在后台线程中执行,可以使主线程保持响应,提高用户体验。

  4. 并行处理:多线程可以在多个处理器或多核系统上并行执行任务,充分利用计算资源,提高程序的处理能力。

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函数。

具体解释如下:

  1. HANDLE hThread[1];:定义了一个名为hThreadHANDLE类型的数组,用于存储线程的句柄。

  2. hThread[0] = (HANDLE)_beginthreadex(NULL, 0, TcpServerThread, this, 0, NULL);:调用_beginthreadex()函数创建一个新的线程,并将线程句柄存储在hThread[0]中。

    _beginthreadex()函数是Windows API的一个线程创建函数,它用于创建一个新的线程并立即开始执行。具体参数解释:
    • NULL:表示线程标识符,用于获取线程的ID,这里不使用。
    • 0:表示线程运行时的创建选项,默认为0。
    • this:表示将当前对象的指针作为参数传递给线程函数。
    • ServerThread:表示要执行的线程函数,这个函数在后面的代码中应该有定义。
    • 0:表示使用默认的线程堆栈大小。
    • NULL:表示使用默认的线程安全属性。
  3. 通过以上代码,一个新的线程就被创建并开始执行TcpServerThread函数。

需要注意的是,该代码片段中只创建了一个线程,因为hThread数组只有一个元素。如果需要创建多个线程,可以将hThread定义为具有多个元素的数组,并在循环中使用_beginthreadex()函数创建多个线程。另外,使用完线程后,还需要适当地释放线程资源,例如在适当的地方调用CloseHandle()函数关闭句柄。

那我们再来看看要执行的线程函数ServerThread()

unsigned int __stdcall ServerThread(PVOID arg)
{
	Server * pThread = (Server *)arg;  
	pThread->Communicate(); 
	return 0;
}

具体解释如下:

  1. unsigned int __stdcall ServerThread(PVOID arg):定义了一个名为ServerThread的函数,返回类型为unsigned int,参数类型为PVOID(即void*)。

    __stdcall是一种调用约定,用于指定函数参数的传递方式和堆栈的清理方式。在Windows平台上,线程函数通常使用__stdcall调用约定。
  2. Server * pThread = (Server *)arg;:将传递给线程函数的参数arg强制转换为Server*类型,并将其赋值给名为pThread的局部变量。这里传入的参数arg在上面_beginthreadex()函数已经提到,是this这个参数表示将当前对象的指针作为参数传递给线程函数。

  3. pThread->Communicate();:通过pThread指针调用Server类的Communicate()方法。

  4. return 0;:返回0,表示线程执行完毕。

本文待续 

猜你喜欢

转载自blog.csdn.net/weixin_55696427/article/details/134420806