Nachos 课程设计task1.1

Nachos task1.1
要求:实现  KThread.join()  方法。 该方法只被调用一次。
实现: join 方法是当一个线程调用他时,当前执行的线程被挂起,该线程执行,直到该线程执行完后,当前线程才继续执行。在这里我们用信号量的方法实现,具体的思路如下:当一个线程调用 join 时,当前线程执行 P 操作将自己挂起,调用线程开始执行,当调用线程执行完之后,即 finish 时,再将当前线程唤醒。代码实现如下:
首先定义一个信号量:
private Semaphore joinSignal = new Semaphore(0);
join
的具体方法如下,当调用该方法时, joinsignal 进行 p 操作
public void join() {
        Lib.debug(dbgThread, "Joining to thread: " + toString());

        Lib.assertTrue(this != currentThread);
        joinSignal.P();
                                
    }
调用线程结束后需要将当前线程唤醒,所以在 finish 中加入唤醒的 v 语句:
currentThread.joinSignal.V();
注意这句话需要加在 sleep ()之前,只有唤醒后才可以睡觉
接下来就是进行测试:
public static void joinTest() {
        System.out.println("This is join test:");
        Lib.debug(dbgThread, "Enter KThread.selfTest");

        KThread a = new KThread(new PingTest(1)).setName("forked thread");
        a.fork();
        a.join();

        new PingTest(0).run();
    }
     public void selfTest() 中进行测试:
Kthread.joinTest();
测试的结果如下:(线程 1 是我们新创建的,调用 join ())
This is join test:
*** thread 1 looped 0 times
*** thread 1 looped 1 times
*** thread 1 looped 2 times
*** thread 1 looped 3 times
*** thread 1 looped 4 times
*** thread 0 looped 0 times
*** thread 0 looped 1 times
*** thread 0 looped 2 times
*** thread 0 looped 3 times
*** thread 0 looped 4 times
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值