关闭Linux线程的closehandle方法 (closehandle 线程 linux)

在Linux系统中,线程是非常常见的开发组件,线程的使用能够在程序中提高并发性能,使得程序更加高效。然而,线程在使用过程中也可能出现一些问题,例如线程无法正常退出导致程序崩溃等。因此,在使用线程时,我们需要充分了解如何正确地关闭线程。在本文中,我们将介绍如何使用closehandle方法来关闭Linux线程。

closehandle方法简介

closehandle是Linux系统中关闭线程的方法之一。该方法的主要作用是关闭一个已经打开的线程句柄,释放线程所占用的资源。

在Linux系统中,每一个线程都有一个唯一的线程句柄,这个句柄是由操作系统分配的。closehandle方法可以接收这个线程句柄作为参数,并对其进行释放。

closehandle方法的调用格式如下所示:

int closehandle(pthread_t thread);

其中,pthread_t定义为线程句柄类型。

closehandle方法的使用示例

下面是一个使用closehandle方法关闭线程的示例代码:

#include

#include

#include

// 线程函数

void* ThreadFunc(void *pArg)

{

int nCount = 0;

while (nCount

{

printf(“ThreadFunc: %d\n”, nCount);

nCount++;

}

return NULL;

}

int mn()

{

pthread_t hThread;

int nRet = pthread_create(&hThread, NULL, ThreadFunc, NULL);

if (nRet != 0)

{

printf(“CreateThread error: %d\n”, nRet);

return 1;

}

// 在主线程中等待用户输入以结束线程

char szInput[128];

fgets(szInput, sizeof(szInput), stdin);

// 关闭线程

nRet = closehandle(hThread);

if (nRet != 0)

{

printf(“CloseThread error: %d\n”, nRet);

return 1;

}

return 0;

}

在这个示例中,我们首先创建了一个线程,并在其中输出一些内容。然后,我们等待用户输入以结束线程。当用户输入后,我们调用closehandle方法来关闭线程。

注意,调用closehandle方法并不会立即终止线程。这个方法只是将线程标记为需要关闭,并等待线程自行退出。如果线程无法正常退出,则需要通过其他方法来强制终止线程。

closehandle方法的错误处理

在使用closehandle方法时,也需要注意错误处理。如果closehandle方法调用失败,我们需要及时处理错误并释放线程句柄。

下面是一个处理closehandle方法错误的示例代码:

int nRet = closehandle(hThread);

if (nRet != 0)

{

printf(“CloseThread error: %d\n”, nRet);

// 发生错误时,需要释放线程句柄

pthread_cancel(hThread);

return 1;

}

在这个示例中,如果closehandle方法调用失败,我们会先释放线程句柄,然后返回错误码。

相关问题拓展阅读:

linux中有没有替代windows串口编程中SetCommBreak()与ClearCommBreak()?

(一)Windows API串口通信编程概述

Windows环境下的串口编程与DOS环境下的串口编程有很大不同。Windows环境下的编程的更大特征之一就是设备无关性,它通过设备驱动程序将Windows应用程序同不同的外部设备隔离。Windows封装了Windows的通信机制,这种方式称为通信API,Windows程序可以利用Windows通信API进行编程,不用对硬件直接进行操作。这种体系被称为Windows开放式服务体系(WOSA,Windows Open Services Architectures)。

早期的Windows3.x与Windows 9x/NT/2023的通信API有很大不同,在16位的串行通信程序中,一般使用16位的Windows API通信函数。为使大家对串口通信有一全面的理解,下面简单介绍一下16位的Windows API通信函数:

(1)打开和关闭串口

OpenComm()打开串口资源,并指定输入、输出缓冲区的大小(以字节计);

CloseComm()关闭串口;

例:

int idComDev;

idComdev=OpenComm(“COM1”,1024,512);

CloseComm(idComDev);

(2)初始化串口

BuildCommDCB()、setCommState()填写设备控制块DCB,然后对已打开的串口进行参数配置,例:

DCB dcb;

BuildCommDCB(〝COM1:2400,n,8,1〞,&dcb);

SetCommState(&dcb);

(3)对串口进行读写

ReadComm、WriteComm()对串口进行读写操作,即数据的接收和发送。例:

char *m_pReceive; int count;

ReadComm(idComDev,m_pReceive,count);

Char wr; int count2;

WriteComm(idComDev,wr,count2);

通过对以上的描述我们可以看出,16位以下的串口通信程序更大的特点就在于串口等外部设备的操作有自己特有的API函数。

Windows 9x/NT/2023中的API一般都支持32位的操作,因此又称为Win32API。为了在上述系统中实现串行数据传送,可以使用Win32通信API。Win32通信API基本上是一个串行端口API,不是很适合于局域网(LAN)通信。虽然在线路上发送数据之前,LAN通常将数据位串行化,这和窗口或调制解调器发送数据之前所作的工作一模一样,但局域网使用的线路的位数通常比串口少,而且还使用与串口协议很少有类似之处的访问、路由、安全性和纠错协议。局域网通信所需要的协议层使得Win32通信API对于这些应用来说很不理想。因此,在网络通信和连接方面,TCP/IP协议要比Win32通信API更适合一些。

Windows操作系统是一个可抢占式的操作系统,所以Windows应用程序常常有被别的程序抢占时间片的可能,因此Win32通信API也不能用于实时通信。实时通信的质量与时间密切相关。例如,数字化音频数据是实时数据,因为话音的质量依赖于播放它的速率。在录制音频时,它就以某个速度被数字化了,该速度就是人们所熟知的采样速率。声音必须以相同的采样率重放,否则听起来就会太慢或太快。实际中的视频播放,也不是实时播放,那仅仅是存放在缓冲中的那部分数据。因此,不需要许多协议层的交互式、非实时的通信可以采用Win32通信API来实现。Win32通信API把串口操作(以及并口等)和文件操作统一起来了,使用类似的操作来实现。

(二) Windows串口通信相关API函数

“工欲善其事,必先利其器”,这一节将从使用的角度出发,对和串口通信相关的32位的Windows API函数进行介绍,力图使你们对其有个全面、准确的认识。

2.1 打开和关闭串口

1. 打开串口

在32位的Windows系统中,串口和其它通信设备是作为文件处理的。串口的打开、关闭、读取和写入所用的函数与操作文件的函数完全一致。

通信会话以调用CreateFile()开始。CreateFile()为读访问、写访问或读写访问“打开”串口。按照Windows的通常做法,CreateFile()返回一个句柄,随后在打开的端口的操作中使用CreateFile()函数非常复杂,复杂性的原因之一是它是通用的。可以使用CreateFile打开已存在的文件,创建新文件和打开根本就不是文件的设备,例如串口、并口和调制解调器。CreateFile()函数声明如下:

HANDLE CreateFile(

LPCTSTR lpszName,

DWORD fdwAccess,

DWORD fdwShareMode,

LPSECURITY_ATTRIBUTES lpsa,

DWORD fdwCreate,

DWORD fdwAttrsAndFlags,

HANDLE hTemplateFile

)

CreateFile函数中的参数解释如下:

·lpszName:指定要打开的串口逻辑名,用字符串表示,如“COM1”和“COM2”分别表示串口1和串口2。

·fdwAccess:用来指定串口访问的类型。与文件一样,串口也是可以被打开以供读取、写入或者两者兼有。

GENERIC_READ位读取访问打开端口,GENERIC_READ位写访问打开端口。这两个常数定义如下:

const GENERIC_READ = 0xh;

const GENERIC_WRITE = 0xh;

用户可以用逻辑操作将这两个标识符连接起来,为读/写访问权限打开端口。因为大部分串口通信都是双向的,因此常常在设置中将两个标识符连接起来使用。如:

fdwAccess = GENERIC_READ | GENERIC_WRITE;

·fdwShareMode:指定该端口的共享属性。该参数是为那些由许多应用程序共享的文件提供的。对于不能共享的串口,它必须设置为0。这就是文件与通信设备之间的主要差异之一。如果在当前的应用程序调用CreateFile()时,另一个应用程序已经打开了串口,该函数就会返回错误代码,原因是两个应用程序不能共享一个端口。然而,同一个应用程序的多个线程可以共享由CreateFile()返回的端口句柄,并且根据安全性属性设置,该句柄可以被打开端口的应用程序的子程序所继承。

·Ipsa:引用安全性属性结构(SECURITY_ARRTIBUTES),该结构定义了一些属性,例如通信句柄如何被打开端口的应用程序的子程序所继承。将该参数设置为NULL将为该端口分配缺省的安全性属性。子应用程序所继承的缺省属性是该端口不能被继承的。

安全属性结构SECURITY_ARRTIBUTES结构声明如下:

typedef struct_SECURITY_ARRTIBUTE {

DWORD nLength;

LPVOID lpSecurityDescriptor;

BOOL bInheritHandle;

} SECURITY_ARRTIBUTE;

SECURITY_ARRTIBUTES结构成员nLength指明该结构的长度,lpSecurityDescriptor指向一个安全描述字符,bInheritHandle表明句柄是否能被继承。

·fdwCreate:指定如果CreateFile()正在被已有的文件调用时应采取的动作。因为串口总是存在,fdwCreate必须设置成OPEN_EXISTING。该标志告诉Windows不用企图创建新端口,而是打开已经存在的端口。OPEN_EXISTING常数定义为:

const OPEN_EXISTING = 3;

·fdwAttrsAndFlags:描述了端口的各种属性。对于文件来说,有可能具有很多属性,但对于串口,唯一有意义的设置是FILE_FLAG_OVERLAPPED。当创建时指定该设置,端口I/O可以在后台进行(后台I/O也叫异步I/O)。FILE_FLAG_OVERLAPPED常数定义如下:

const FILE_FLAG_OVERLAPPED = 0xh

·hTemplateFile:指向模板文件的句柄,当端口处于打开状态时,不使用该参数,因而必须置成0。

调用CreateFile()函数打开COM1串口操作的例子如下所示:

HANDLE hCom;

DWORD dwError;

hCom=CreateFile(“COM1”, // 文件名

GENERIC_READ | GENERIC_WRITE, // 允许读和写

0, // 独占方式

NULL,

OPEN_EXISTING, // 打开而不是创建

FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, // 重叠方式

NULL

);

if(hCom = = INVALID_HANDLE_VALUE)

{

dwError=GetLastError(); // 处理错误

}

一旦端口处于打开状态,就可以分配一个发送缓冲区和接收缓冲区,并且通过调用SetupComm()实现其它初始化工作。也可以不调用SetupComm()函数,Windows系统也会分配缺省的发送和接收缓冲区,并且初始化端口。但为了保证缓冲区的大小与实际需要的一致,更好还是调用该函数。SetupComm()函数声明如下:

BOOL SetupComm(

HANDLE hFile, // 通信设备句柄

DWORD dwInQueue, // 输入缓冲区大小

DWORD dwOutQueue // 输出缓冲区大小

);

SetupComm()函数中各项含义说明如下:

·hFile: 由GreatFile()返回的指向已打开端口的句柄。

·dwInQueue和dwOutQueue: 接收缓冲区的大小和发送缓冲区的大小。这两个定义并非是实际的缓冲区的大小,指定的大小仅仅是“推荐的”大小,而Windows可以随意分配任意大小的缓冲区。Windows设备驱动程序可以获得这两个数据,并不直接分配大小,而使用来优化性能和避免缓冲区超限。

注意:当使用CreateFile()函数打开串口时:为实现调制解调器的排他性访问,共享标识必须设为零;创建标识必须设为OPEN_EXISTING;模板句柄必须置为空。

2. 关闭串口

关闭串口比打开串口简单得多,只需要调用CloseHandle()函数关闭由CreateHandle()函数返回得句柄即可。

CloseHandle函数声明如下:

BOOL CloseHandle(

HANDLE hObject // 需关闭的设备句柄

);

使用串口时一般要关闭它,如果忘记关闭串口,串口就会始终处于打开状态,其它应用程序就不能打开并使用串口了。

附上出处链接:

关于closehandle 线程 linux的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。


数据运维技术 » 关闭Linux线程的closehandle方法 (closehandle 线程 linux)