C++ 如何对设备执行非阻塞写入?

C++ 如何对设备执行非阻塞写入?,c++,c,asynchronous,io,nonblocking,C++,C,Asynchronous,Io,Nonblocking,是否可以将write()设为;功能无阻塞而不使用线程 short buffer[BUFFER_LEN]; int readcount; while ((readcount = sounds[index].read(buffer, BUFFER_LEN))) write(audio_device, buffer, readcount * sizeof(short)); 声音播放,但它会阻止程序播放,直到播放结束。使用fcntl为文件设置O\u NONBLOCK标志可能会起作用,但您需要

是否可以将write()设为;功能无阻塞而不使用线程

short buffer[BUFFER_LEN];
int readcount;

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

声音播放,但它会阻止程序播放,直到播放结束。

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

我添加了O\u NONBLOCK标志,但这只会扭曲声音。我想我必须使用线程。那是因为你忽略了
write
的返回值。如果文件描述符是非阻塞的,
write
可能返回-1,并将
errno
设置为
ewoodblock
,在这种情况下,您必须等待,然后重试写入。当然,
write
返回的字节数总是小于您尝试写入的请求字节数,在这种情况下,您必须保留剩余的字节数并在以后写入。您能给我一些示例代码或我应该读取的位置吗,我应该使用轮询吗?您可以使用
选择
轮询
来确定何时可以写入大多数数据,但这将阻止;这就是重点。如果您已经计划
选择
等待输入,那么这可能是正确的解决方案。另一方面,如果你有更多的计算要做,你只需要在计算过程中不断地重试,或者使用线程。是的,我认为在没有线程安全的情况下使用写函数可能会导致不同的行为,如果同时其他线程使用相同的信息。。。。。。!