为了跟踪线程,我将使用一个ThreadControlBlock元素队列(在 *** 作系统中类似于PCBs),如下所示:
struct ThreadControlBlock { int ThreadID,u_context *context };
我们可以使用setcontext()函数系列来“保存”和“加载”上下文.
在程序初始化时,初始化ThreadQueue而不使用任何元素.
现在我没有得到的部分:当一个线程调用yIEld()时,我得到当前上下文并将其保存在ThreadControlBlock中并放入队列中.然后获取队列中的第一个元素并在其中加载上下文,然后执行.
问题是,如果我这样做,说我是一个调用yIEld()的线程,下一个线程是我自己.如果我正在保存上下文并再次加载它,那么在重新输入时我不会在我所在的完全相同的位置(在调用yIEld()之前)这会继续下去吗?
解决方法 如果您正在切换到另一个任务,那么同样的问题实际上也适用 – 因为其他任务在同一点(它将要切换到第二个任务)保存其上下文.使用setcontext()和getcontext(),您需要使用静态变量来跟踪您是要切换还是切换:static volatile int switched;switched = 0;getcontext(current->context);if (!switched){ switched = 1; setcontext(next->context);}
或者,您可以使用swapcontext(current-> context,next-> context);
总结以上是内存溢出为你收集整理的用户空间中的线程和产量全部内容,希望文章能够帮你解决用户空间中的线程和产量所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)