(九)多线程之间的通信

一、线程

1、fork.....join:里面的线程并行执行,以begin...end为界线,当fork.....join里面所有的线程执行完之后才跳出fork.....join,执行后面的语句(主线程),begin...end里面的语句并行执行

示例:

module test;
initial begin
	$display ("%t:AAAA",$time);
	#10 $display ("%t:BBBB",$time);
fork
	$display ("%t:CCCC",$time);
	#50 $display ("%t:DDDD",$time);
	#10 $display ("%t:EEEE",$time);
	begin
		#30 $display ("%t:FFFF",$time);
		#10 $display ("%t:GGGG",$time);
	end
join
	$display ("%t:HHHH",$time);
	#80 $display ("%t:IIII",$time);
end
endmodule

打印结果:
0:AAAA
10:BBBB
10:CCCC
20:EEEE
40:FFFF
50:GGGG
60:DDDD
60:HHHH
140:IIII

说明:

  • fork...join中有4个并行的线程

2、fork...join_any:fork...join_any中任何一个线程结束,则会继续执行主线程,fork...join_any中还没执行完的线程会继续执行。

示例:

module test;
initial begin
	$display ("%t:AAAA",$time);
	#10 $display ("%t:BBBB",$time);
fork
	$display ("%t:CCCC",$time);
	#50 $display ("%t:DDDD",$time);
	#10 $display ("%t:EEEE",$time);
	begin
		#30 $display ("%t:FFFF",$time);
		#10 $display ("%t:GGGG",$time);
	end
join_any
	$display ("%t:HHHH",$time);
	#80 $display ("%t:IIII",$time);
end
endmodule

打印结果:
0:AAAA
10:BBBB
10:CCCC
10:HHHH
20:EEEE
40:FFFF
50:GGGG
60:DDDD
90:IIII

3、fork_join_none:fork_join_none中的线程和主线程同时执行,不需要fork_join_none中任何一个线程完成。

示例:

module test;
initial begin
	$display ("%0t:AAAA",$time);
	#10 $display ("%0t:BBBB",$time);
fork
	$display ("%0t:CCCC",$time);
	#50 $display ("%0t:DDDD",$time);
	#10 $display ("%0t:EEEE",$time);
	begin
		#30 $display ("%0t:FFFF",$time);
		#10 $display ("%0t:GGGG",$time);
	end
join_none
	$display ("%0t:HHHH",$time);
	#80 $display ("%0t:IIII",$time);
end
endmodule

打印结果:
0:AAAA
10:BBBB
10:HHHH
10:CCCC
20:EEEE
40:FFFF
50:GGGG
60:DDDD
90:IIII

 说明:

  1. wait fork;该语句会等待前面的所有fork语句(包含前三种fork类型)执行完毕后才会继续执行后面的语句 。
  2. disable fork;停止当前fork线程中未被执行的所有子线程,如果是fork...join_nany、fork...join_none后接disable fork,里面的线程会全部被杀掉。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值