用户级线程上下文切换:如何检测线程何时在C中阻塞?

时间:2016-08-31 20:15:38

标签: c multithreading parallel-processing pthreads multitasking

正如标题所示,C中有没有办法检测在内核级线程上运行的用户级线程,例如pthread是否阻塞(或即将阻塞)I / O?

我的用例如下:我需要在多线程环境中执行任务(在内核线程之上,例如pthreads)。这些任务基本上是可以同步的用户功能,可以在其中使用阻塞操作。我需要在实现中隐藏延迟。因此,我正在探索将任务实现为用户级线程以更好地控制其执行上下文的想法,这样,当任务阻塞或同步时,我上下文切换到其他就绪任务(即,实现我自己的调度程序)用户级线程)。因此,几乎可以完全使用操作系统的每个内核线程的时间量。

1 个答案:

答案 0 :(得分:2)

以前有代码执行此操作,例如GNU pth。它通常被放弃,因为它不能很好地工作,我们现在有更好的选择。你有两个选择:

1)如果您有操作系统帮助,则可以使用操作系统机制。 Windows为此提供操作系统帮助,IOCP调度使用它。

2)如果您没有操作系统帮助,那么您必须将所有阻止操作转换为调用您的调度程序而不是阻止的非阻塞操作。因此,例如,如果有人调用socket,则拦截该调用并将套接字设置为非阻塞。当他们呼叫read时,您拦截该呼叫,如果他们得到“阻止”指示,您可以安排在操作成功时恢复并安排另一个线程。

您可以查看GNU pth,了解如何使选项2工作。但要注意,GNU pth是full of reported bugs,因为它被放弃了,所以从未被修复过。它将让您了解如何在协作用户空间线程环境中实现互斥和睡眠等内容。但实际上并没有使用代码。