我应该在 C 中实现一个用户级线程库。为此,我需要实现 yield()
、createThread()
和 destroyThread( )
函数。我相信我已经掌握了正确的基础知识:
为了跟踪线程,我将使用如下所示的 ThreadControlBlock
元素队列(类似于操作系统中的 PCBs):
struct ThreadControlBlock {
int ThreadId,
u_context *context };
我们可以使用 setcontext()
系列函数来“保存”和“加载”上下文。
在程序初始化时,初始化没有元素的 ThreadQueue。
现在是我没有得到的部分:当线程调用 yield()
时,我得到当前上下文并将其保存在 ThreadControlBlock
中并放入队列中。然后获取队列中的第一个元素并在其中加载上下文,然后继续执行。
问题是,如果我这样做,假设我是一个调用 yield()
的线程,而下一个线程是我自己。如果我正在保存上下文并再次加载它,那么在重新进入时我会不会在我所在的位置(在调用 yield()
之前?)并且这将永远持续下去?
最佳答案
当线程调用 yield()
时,您必须保存即将从 yield()
调用返回的线程的状态。不要保存 yield()
之前的上下文。
关于c - 用户空间中的线程和产量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3781868/