[转帖]一个多线程,以及对数组的互斥操作的测试程序
- #!/usr/bin/perl
- # 一个多线程,以及对数组的互斥操作的测试程序 战鹰
- use threads;
- use threads::shared;
- my @scalar;
- share(@scalar);#让该数组在线程间共享
- sub start_thread_1
- {
- #程序主线程函数
- my $id=shift;
- for(1..50)
- {
- if($locked==0)
- {
- #这个条件判断没有实际用途,只不过是为了让Perl在if条件内的过程运行结束以后打开对共享数组的琐定
- #您也可以注销这个条件判断,但您将得到一个完全不同的运行结果
- lock(@scalar);#琐定共享数组
- my $sc=rand(10);#获得一个随机数
- push(@scalar,$sc);#将该随机数压入共享数组
- print "$id:$sc\n";
- cond_signal @scalar;#从阻塞队列中释放一个线程
- }
- sleep(1);
- }
- cond_signal @scalar;
- }
- sub start_thread_2
- {
- my $id=shift;
- while(1)
- {
- #进行无限循环,正常的程序中应尽量避免这种循环,否则线程将不能正常的结束
- if(@scalar>0)
- {
- #如果共享数组内的元素个数大于0,则从中取出一个元素
- lock(@scalar);
- my $sc=shift @scalar;
- print "$id:$sc\n";
- }
- else
- {
- #如果共享数组内的元素个数等于0,则将线程阻塞,直到主线程将其从阻塞队列中释放出来
- lock(@scalar);
- cond_wait @scalar;
- }
- }
- }
- #创建三个子线程
- my $thread_2 = threads->create("start_thread_2",1);
- my $thread_3 = threads->create("start_thread_2",2);
- my $thread_4 = threads->create("start_thread_2",3);
- #运行主线程
- start_thread_1(';main';);
复制代码 |