Nachos课程设计task1.4
要求:要求是实现同步发送和接收一个字消息的方法,使用条件变量,不使用信号量。实现Communicator类中的speak和listen方 法 。speak是 原 子操 作 ,等 待 直至 该Communicator类 中 的listen方法被调用然后传递该字给listen方法。一旦传递完成两个 方法均可返回。 同样的,listen方法等待直到speak方法被调用,一旦传递完成两个方法均可返回。实现方法必须能够在以下情况中工作:即使同一个Communicator有多个speaker或者listener在使用。每一个cmmunicator只能使用一个锁。实现同步机制,并使用类Communicator。使用类似同步链表SynchList中selftest方法的方式,SynchList类中有一个linkedlist,初始化了一个条件变量(什么叫条件变量?条件变量就是等待直到一个条件实现了就被唤醒),SynchList中就是利用信号量来唤醒等待在该linkedlist上的object,这里面有add和removefirst方法,都是原子操作(加锁实现原子性)。所以此时可保证speak和listen方法均为原子操作。speak方法调用SynchList.add将数据加入链表中,listen方法调用SynchList.removeFirst方法从链表中取出数据,SynchList本身已经通过条件变量实现了当链表空时调用removeFirst会等待直到链表非空才返回的功能。即speak一个数据后,要等到listener读完后才可以进行下一个数据的add。
communicator中的speak方法实现如下:
public void speak(int word) {
Speaker.add(word);
Listener.removeFirst();
}
speak说完话(即add)完后,只有等到listener读完才完成该方法。listener方法实现如下:
public int listen() {
int word =(Integer)Speaker.removeFirst();
Listener.add(word);
return word;
}
}
当然不要忘记初始化两个SynchList来表示speaker和listener
private SynchList Speaker;
private SynchList Listener;
public Communicator() {
Speaker = new SynchList();
Listener = new SynchList();
}
测试communicator
在ThreadedKernel的selfTest中进行,两个线程一个收一个发,通过观察输出可以发现所有的发送都在对方接到后返回,所有的接收都在得到发送后返回。则实现该功能。
/**
* communicater selftest
*
* @author dan
* @see nachos.Communicator
*/
private static class Speaker implements Runnable {
private Communicator c;
Speaker(Communicator c) {
this.c = c;
}
public void run() {
for (int i = 0; i < 10; ++i) {
System.out.println("speaker speaking" + i);
c.speak(i);
System.out.println("speaker spoken");
}
}
}
public static void SpeakTest() {
Communicator c = new Communicator();
new KThread(new Speaker(c)).setName("Speaker").fork();
for (int i = 0; i < 10; ++i) {
System.out.println("listener listening " + i);
int x = c.listen();
System.out.println("listener listened, word = " + x);
}
}
对应输出:
listenerlistening 0
speakerspeaking 0
listenerlistened, word = 0
listenerlistening 1
speakerspoken
speakerspeaking 1
listenerlistened, word = 1listener listening 2
speakerspoken
speakerspeaking 2
listenerlistened, word
listenerlistening 3
speakerspoken
speakerspeaking 3
listenerlistened, word
listenerlistening 4
speakerspoken
speakerspeaking 4
listenerlistened, word
listenerlistening 5
speakerspoken
speakerspeaking 5
listenerlistened, word
listenerlistening 6
speakerspoken
speakerspeaking 6
listenerlistened, word
listenerlistening 7
speakerspoken
speakerspeaking 7
listenerlistened, word
listenerlistening 8
speakerspoken
speakerspeaking 8
listenerlistened, word
listenerlistening 9
speakerspoken
speakerspeaking 9
listenerlistened, word
speakerspoken