【问题标题】:How to perform a non-blocking write to device?如何对设备执行非阻塞写入?
【发布时间】:2011-05-29 18:45:53
【问题描述】:

是否可以进行 write();不使用线程的非阻塞函数?

short buffer[BUFFER_LEN];
int readcount;

while ((readcount = sounds[index].read(buffer, BUFFER_LEN)))
    write(audio_device, buffer, readcount * sizeof(short));

声音播放,但它会阻止程序直到播放完毕。

【问题讨论】:

  • 是的,我认为如果同时使用相同信息的其他线程......!

标签: c++ c asynchronous io nonblocking


【解决方案1】:

使用fcntl 为文件设置O_NONBLOCK 标志可能会起作用,但您需要准备好处理部分写入和EWOULDBLOCK 错误。

【讨论】:

  • 我在其中添加了 O_NONBLOCK 标志,但这只会扭曲声音。我想我将不得不使用线程。
  • 那是因为你忽略了write 的返回值。如果文件描述符是非阻塞的,write 可能会返回-1,而errno 设置为EWOULDBLOCK,在这种情况下,您必须等待稍后再尝试写入。当然,write 返回的字节数总是少于您尝试写入的请求字节数,在这种情况下,您必须保留其余的缓冲并稍后再写入。
  • 你能给我一些示例代码或者我应该在哪里阅读,我应该使用 poll 吗?
  • 您可以使用selectpoll 来确定何时可以写入大部分数据,但这会阻塞;这就是重点。但是,如果您已经计划 select 等待输入,那么这可能是正确的解决方案。另一方面,如果你有更多的计算要做,你只需要在计算中穿插重试,或者使用线程。
猜你喜欢
  • 1970-01-01
  • 2011-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-04
  • 1970-01-01
相关资源
最近更新 更多