线程停止c linux,终止Linux C中的阻塞IO

我正在使用多线程在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

或者是我唯一的替代方案,如下所示或实现更高级别的协议,确保阻塞读取接收到签名输入,使其能够自行关闭.

try

{

while(running)

{

nonblocking_read(fd,buffer,512);

if(cancel)

running = false; //break return etc

}

}

//clean up, close fd, release heap memory, 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对关联线程的执行没有影响.

标签:c-2,io,linux,multithreading

来源: https://codeday.me/bug/20190530/1183058.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值