对两个线程进行同步的另一种方式是再使用一个信箱把消费方的完成信息发回给生产方。如下面代码所示:
program automatic mbx_mbx2
mailbox mbx, rtn;
class Producer;
task run();
int k;
for(int i=1; i<4; i++)begin
$display("Producer: before put(%0d)", i);
mbx.put(i);
rtn.get(k);
$display("Producer: after get(%0d)", k);
end
endtask
class Consumer;
task run();
int i;
repeat(3)begin
$display("Consumer: before get");
mbx.get(i);
$display("Consumer: after get(%0d)", i);
rtn.put(-i);
end
endtask
endclass
Producer p;
Consumer c;
initial begin
mbx = new();
rtn = new();
p = new();
c = new();
//使生产方和消费方并发运行
fork
p.run();
c.run();
join
end
endgrogram
下面是程序运行的结果:
Producer: before put(1)
Consumer: before get
Consumer: after get(1)
Consumer: before get
Producer: after get (-1)
Producer: before put(2)
Consumer: after get(2)
Consumer: before get
Producer: after get(-2)
Producer: before put(3)
Consumer: after get(3)
Producer: after get(-3)
由运行结果可知,生产方和消费方运行时成功地取得了一致。