我了解到某个进程已正在运行,就绪,已阻止和已暂停状态。除了被挂起之外,线程还具有这些状态,因为它存在于进程的地址空间中。
进程在阻塞i / o或等待事件时会阻塞大部分时间。
如果它的单线程或者它遵循一对多模型,我可以轻松地想象一个被阻止的进程,但是如果进程是多线程的,它是如何工作的?
例如:
我有一个进程,系统中有两个线程遵循一对一模型。 一个处理gui,另一个处理阻塞i / o 。我知道该进程仍然响应,因为另一个线程处理i / o。
那么这个过程是否有可能被阻止,或者我是否应该在这种情况下排除它?
我刚刚接触到这些东西,请原谅我如果我还不了解一些重要的细节。
答案 0 :(得分:1)
假设您有一个工作队列,其中UI线程安排工作要完成,I \ O线程在那里查找工作要做。工作队列本身是从两个线程读取和修改的数据,因此您必须以某种方式同步访问或导致竞争条件。
天真的方法是使用锁(也称为关键部分)同步对队列的访问。如果I \ O线程获取锁定然后阻塞,则UI线程将仅保持响应,直到它确定它需要安排工作并尝试获取锁定。更好的方法是使用一个无锁的队列,其中已经写了很多,您可以轻松搜索更多信息。
但要回答你的问题,是的,即使使用多个线程,它仍然比你想象的更容易导致UI口吃/挂起。有各种库可以更容易或更难解决这个问题,因此根据您选择的操作系统和语言,可能有一些比OS原语更好的东西。 Win32(根据我的记忆)尽管有各种同步原语,但它并没有让它变得非常简单。对我来说,Pthreads和Boost似乎也不是那么简单。 Apple的GCD在语义上更容易表达您想要的内容(在我看来),尽管仍然存在必须注意的陷阱(例如在单个工作队列上安排过多的阻塞操作)并行完成并导致处理器在它们同时唤醒时发生抖动。)
我的建议是潜入并编写大量多线程代码。它可能很难调试,但你会学到很多东西,最终它成为第二天性。