1

我了解到一个进程具有运行就绪阻塞暂停状态。线程也有这些状态,除了挂起,因为它存在于进程的地址空间中。

进程在执行阻塞 i/o 或等待事件时大部分时间都会阻塞。

如果一个进程是单线程的,或者它遵循一对多模型,我可以很容易地想象出一个进程会被阻塞,但是如果进程是多线程的,它是如何工作的呢?

例如:

我在遵循一对一模型的系统中有一个带有两个线程的进程。一个处理 gui,另一个处理阻塞 i/o。我知道该进程保持响应,因为另一个线程处理 i/o。

那么这个过程是否有可能被阻止,或者在这种情况下我应该排除它吗?

我只是进入这些东西所以请原谅我如果我还没有理解一些重要的细节。

4

1 回答 1

1

假设您有一个工作队列,UI 线程在其中安排要完成的工作,而 I\O 线程在那里寻找要完成的工作。工作队列本身是从两个线程读取和修改的数据,因此您必须以某种方式同步访问,否则会导致竞争条件。

天真的方法是使用锁(也称为临界区)同步对队列的访问。如果 I\O 线程获取锁然后阻塞,UI 线程将只保持响应,直到它决定需要安排工作并尝试获取锁。更好的方法是使用一个无锁队列,其中已经写了很多,您可以轻松搜索更多信息。

但是要回答您的问题,是的,即使在使用多个线程时,导致 UI 卡顿/挂起仍然比您想象的要容易得多。有各种库可以让解决这个问题变得更容易或更难,因此根据您的操作系统和选择的语言,可能有比操作系统原语更好的东西。尽管有各种同步原语,Win32(据我所知)并没有让它变得非常容易。Pthreads 和 Boost 在我看来也从来没有那么简单。Apple 的 GCD 使表达你想要的东西在语义上更容易(在我看来),尽管仍有一些陷阱必须注意(例如在单个工作队列上调度太多阻塞操作以并行完成,并导致处理器在它们同时唤醒时抖动)。

我的建议是深入研究并编写大量多线程代码。调试起来可能很困难,但你会学到很多东西,最终它会成为第二天性。

于 2013-08-07T16:15:58.553 回答