【问题标题】:Freeing the buffer of a blocked stream in C在 C 中释放阻塞流的缓冲区
【发布时间】:2012-04-30 12:24:31
【问题描述】:

在多线程应用程序中,我需要取消线程。他们中的一些人使用flockfile 显然不是pthread_cancel 的有效取消点的机制。我设法通过使用pthread_kill 发送SIGUSR1 信号来杀死线程,迫使它们在信号处理程序中使用pthread_exit。在我的情况下,清理分配的内存被证明很简单(它都在堆栈上),但我当然不能关闭文件流。有没有办法释放缓冲区或删除锁?在我的系统上,每个未关闭的缓冲区都会占用 16KB 的内存,这些内存会迅速累积。

【问题讨论】:

  • 这只是一种解决方法,但有ftrylockfile
  • 好吧,lockf 进行了“重新设计”,但是...
  • 我试过ftrylockfile 但这只有在线程尚未获得锁时才有帮助。有时它会在锁定的通道中间卡住线程,再次出现同样的问题。嗯,lockf好像是在进程级别实现的?
  • “在进程级别”是什么意思?在 linux 上,lockf 是通过 fcntl(F_SETLKW) 实现的。它不是在用户空间完成的,也不是进程私有锁。

标签: c multithreading stream buffer


【解决方案1】:

您应该向它们传达“完成”消息,而不是强制杀死线程,然后线程可以在退出清理之前自行清理。

您已经在使用 SIGUSR1 进行消息传递部分,因此您需要跟踪打开的句柄,以便您可以从信号处理程序中解锁/释放任何正在使用的句柄

【讨论】:

  • 我有文件句柄,但除了刚刚杀死的线程之外,您无法从另一个线程解锁它们。信号处理程序中没有任何信息可以允许信号线程对其进行处理。
  • 除非信号线程被阻塞,否则您可以向它发送消息(跟踪哪些线程“拥有”您锁定的资源)以解锁资源。如果线程被阻塞,你应该改变用于允许中断的阻塞机制(例如只阻塞特定时间然后检查它是否需要退出,如果不需要则再次阻塞)
  • 是的,它被阻止了,甚至很可能。阻塞调用是对流的 getc_unlocked 调用。有没有非阻塞版本的getc,我没找到?
  • 来自manual 如果您使用非阻塞套接字,如果此时没有可读取的内容,您可以重试(返回值:EWOULDBLOCK):睡眠,检查退出条件并尝试再读一遍
  • 可以使用fcntl以非阻塞方式打开文件
猜你喜欢
  • 1970-01-01
  • 2011-03-03
  • 1970-01-01
  • 2018-04-02
  • 1970-01-01
  • 2011-11-14
  • 1970-01-01
  • 2012-08-25
  • 1970-01-01
相关资源
最近更新 更多