try{ while(true) { blocking_read(fd,buffer,512); }}catch(interrupt_exception){}//clean up,close fd,release heap memory,usual stuff
或者是我唯一的替代方案,如下所示或实现更高级别的协议,确保阻塞读取接收到签名输入,使其能够自行关闭.
try{ while(running) { nonblocking_read(fd,512); if(cancel) running = false; //break return etc }}//clean up,usual stuff
所以,如果你中断线程导致它抛出异常,那么read()中是否会发生一些魔术内存泄漏.
或者我应该不关心并让析构函数杀死线程(我假设当你删除持有线程的对象时线程终止)?并在那里清理?喜欢
class MyClass{ int fd; Thread* myThread; ~MyClass(){ delete myThread; close(fd); }};
谢谢你的帮助!
解决方法 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()超时可用,并且只有fd具有数据时才调用read().这允许您定期检查线程标志是否设置为不再运行,并防止您需要处理信号以从read()中断线程,因为read()不应再阻止等待数据.
此外,删除线程对象时发生的行为取决于线程库.例如,删除pthread_t或boost :: thread对关联线程的执行没有影响.
总结以上是内存溢出为你收集整理的终止Linux C中的阻塞IO全部内容,希望文章能够帮你解决终止Linux C中的阻塞IO所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)