【问题标题】:Thread Block Operation线程块操作
【发布时间】:2017-11-09 05:56:32
【问题描述】:

我问了两个问题(1,2)关于使用线程读取文件以使主线程不会被阻塞。我的问题不在于编写和启动线程,我的问题是我不明白哪些操作被阻塞了。之前有人告诉我,从文件中读取是阻塞的,在我的第二个示例中使用 for 循环是阻塞的。在查看一段代码时,我真的不明白为什么甚至发现它。

所以我的问题显然是,您如何发现或确定操作何时阻塞线程,以及如何解决它?

【问题讨论】:

    标签: multithreading


    【解决方案1】:

    所以我的问题显然是,你如何发现或确定何时 操作正在阻塞一个线程

    没有什么神奇的方法可以做到;通常,您必须阅读有关您调用的任何函数的文档,以便了解它们是否保证快速返回或它们是否可能会长时间阻塞。

    如果您正在查看一个正在运行的程序并想知道它的线程当前在做什么,您可以使用调试器来观察它们,或者在不同的位置插入打印语句以便您知道(通过查看文本获取打印到标准输出和什么文本没有)大致线程在哪里以及它在做什么。

    ,你如何解决它?

    阻止并没有“破坏”,因此无需修复。阻止是故意的行为,例如当您调用从磁盘读取的函数时,它可以在返回时为您提供一些有用的数据。 (考虑另一种非阻塞读取,它总是会立即返回,但在大多数情况下无法为您提供任何数据,因为硬盘驱动器还没有时间加载任何数据——不是非常有用)。

    也就是说,对于网络操作,您可以将套接字设置为非阻塞模式,这样可以保证对 send()、recv() 等的调用永远不会阻塞(它们将返回错误代码)。不过,这只适用于网络;大多数操作系统不支持磁盘访问的非阻塞 I/O。

    【讨论】: