关于阻止线程中的i / o的问题

时间:2011-01-05 04:40:07

标签: linux pthreads

我在Linux上使用pthreads,我的一个线程定期在设备文件描述符上调用write函数。如果写调用需要一段时间才能完成,我的线程是否会被暂停,以便其他线程可以运行?我没有设置pthreads的任何调度功能,所以我的问题是关于默认的线程行为。

5 个答案:

答案 0 :(得分:4)

只要没有其他任何东西试图写入同一资源,其他线程应该在写入线程等待其写入完成时运行。

答案 1 :(得分:2)

如果write()调用阻塞,则仅暂停调用线程。这在POSIX spec for write()

中有记录
  

如果有足够的空间供所有人使用   要求写入的数据   马上,实施应该   这样做。否则,调用线程   可能阻止;也就是说,暂停直到足够   空间可供写作。

请注意,它表示调用线程,而不是调用进程

答案 2 :(得分:1)

查看此处是否明确定义了阻止行为 http://www.akkadia.org/drepper/nptl-design.pdf

答案 3 :(得分:1)

原则上,YES,其他线程可以运行。

但请注意,某些文件系统具有锁定机制,只允许在单个文件上进行一次并发IO操作。因此,如果另一个线程在同一个文件上执行另一个IO(即使它是通过不同的文件描述符),它可能会在write()系统调用的一段时间内阻塞它。

还有其他内部锁用于其他设施。但是,除非他们正在进行密切相关的活动,否则他们中的大多数都不会阻止其他线程运行。

答案 4 :(得分:0)

如果您的设备文件描述符是共享资源,则必须处理锁定。但是一旦它是线程安全的,对这种共享资源的调用就会被序列化,因此如果一个线程写入,其余的被阻塞。如果未实现锁定,则数据可能会出现乱码。