我在Linux上使用pthreads,我的一个线程定期在设备文件描述符上调用write函数。如果写调用需要一段时间才能完成,我的线程是否会被暂停,以便其他线程可以运行?我没有设置pthreads的任何调度功能,所以我的问题是关于默认的线程行为。
答案 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)
如果您的设备文件描述符是共享资源,则必须处理锁定。但是一旦它是线程安全的,对这种共享资源的调用就会被序列化,因此如果一个线程写入,其余的被阻塞。如果未实现锁定,则数据可能会出现乱码。