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
要求:实现 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