网站建设的论坛,西安网站建设兼职,做兼职比较好的网站,海淀网站建设电话有四个函数A、B、C、D#xff0c;地址分别为100、200、300、400#xff1b;有两个线程同时执行#xff1b;
1#xff09;假如只有一个栈 函数A在线程1中执行的时候#xff0c;调用了函数B#xff0c;将函数A中下一条指令的地址入栈#xff08;104#xff09;#xff…有四个函数A、B、C、D地址分别为100、200、300、400有两个线程同时执行
1假如只有一个栈 函数A在线程1中执行的时候调用了函数B将函数A中下一条指令的地址入栈104然后执行函数B函数B中又执行了Yield()函数蓝色Yield()的作用可以理解为切换线程Yield()切换到地址300处的线程执行线程2同时将下一条指令的地址入栈204接下来执行函数C同样道理调用方法D304入栈最后执行函数DYield() 会跳到地址204继续执行204紧接着函数B执行完会返回返回地址是栈顶的值(404)这里的返回地址本应该是104
因此多个线程共用一个栈就会出现问题
2每个线程一个栈 再切换线程时同时也要切换栈这里就需要一个数据结构TCB(Thread control block)来存储栈的指针每个线程都有一个TCB。 线程2中的Yield()函数应该改写成如下格式
void Yield(){TCB2.espesp; espTCB1.esp;jmp 204;
}Yield(){TCB2.espesp; espTCB1.esp;jmp 204;
}
执行过程 在A函数中调用B将地址104入栈(esp1000)在函数B中执行Yield()保存当前栈指针TCB1.esp esp同时切换栈指针espTCB2.esp将地址204入栈跳转到函数C(esp1000)在函数C中调用函数D将地址304入栈esp2000函数D执行Yield()保存栈指针切换栈指针将地址404入栈跳转到函数B继续执行地址204处的代码执行完毕执行 } 弹出线程1栈的栈顶地址204发现此处重复执行地址204处的指令
3最终
线程2的Yield()
void Yield(){TCB2.espesp; espTCB1.esp;
}
这样在2中第四步执行时不再使用jmp 204跳转而是执行 } 将线程1中的栈顶地址出栈。