加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

用户空间中的线程和产量

发布时间:2020-12-16 06:54:50 所属栏目:百科 来源:网络整理
导读:我应该在C中实现一个userlevel线程库.为此,我需要实现yield(),createThread()和destroyThread()函数.我相信我已经掌握了基础知识: 为了跟踪线程,我将使用一个ThreadControlBlock元素队列(在操作系统中类似于PCBs),如下所示: struct ThreadControlBlock { i
我应该在C中实现一个userlevel线程库.为此,我需要实现yield(),createThread()和destroyThread()函数.我相信我已经掌握了基础知识:

为了跟踪线程,我将使用一个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);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读