Cod*_*key 4 c++ linux io multithreading
我在c ++中使用多线程在linux上进行串行IO.目前我正在使用阻止读取.这让我无法阻止阻塞read()中的线程,除非强行终止或中断线程或使用像pthread取消之类的东西.现在遍布网络,我看到人们尖叫着人们建议他们需要终止来自阻塞IO的线程.通常它涉及内存泄漏.只要你正确清理,是否有一些神奇的内存泄漏可能出现在线程中断之外?
try
{
while(true)
{
blocking_read(fd,buffer,512);
}
}catch(interrupt_exception)
{
}
//clean up, close fd, release heap memory, usual stuff
Run Code Online (Sandbox Code Playgroud)
或者是我唯一的替代方案,如下所示或实现更高级别的协议,确保阻塞读取接收到签名输入,使其能够自行关闭.
try
{
while(running)
{
nonblocking_read(fd,buffer,512);
if(cancel)
running = false; //break return etc
}
}
//clean up, close fd, release heap memory, usual stuff
Run Code Online (Sandbox Code Playgroud)
所以,如果你中断线程导致它抛出异常,那么read()中是否会发生一些魔术内存泄漏.
或者我应该不关心并让析构函数杀死线程(我假设当你删除持有线程的对象时线程终止)?并在那里清理?喜欢
class MyClass{
int fd;
Thread* myThread;
~MyClass(){
delete myThread;
close(fd);
}
};
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助!
read()不应泄漏记忆.通过阻塞和非阻塞读取,应用程序代码仍然负责管理作为buf参数提供的内存.read()通过信号中断不会引发异常,因此如果使用信号,则需要检查结果和错误.
read()在读取数据之前被信号中断,则返回-1并将errno设置为EINTR.read()在读取某些数据后被信号中断,则POSIX允许返回-1并将errno设置为EINTR,或者read()返回已读取的字节数.如果您使用,pthread_cancel()那么将抛出异常.使用此方法,您有以下选择:
pthread_cleanup_push().pthread_setspecific().auto_ptr/unique_ptr.abi::__forced_unwind异常,执行清理并重新抛出.通常,请考虑避免线程取消.如果可能的话,拥有一个用于突破循环的共享标志会更好,更易于管理.这允许线程执行任何必要的清理,并防止您的实现依赖于线程库的实现及其任何怪癖.
对于您使用阻塞读取的情况,请考虑轮询fd以查看数据是否通过select()超时可用,并且仅read()在fd具有数据时调用.这允许您定期检查线程标志是否设置为不再运行,并防止您需要处理信号以中断线程read(),因为read()不应再阻止等待数据.
此外,删除线程对象时发生的行为取决于线程库.例如,删除a pthread_t或boost::thread对相关线程的执行没有影响.
| 归档时间: |
|
| 查看次数: |
5825 次 |
| 最近记录: |