[转帖]一个多线程,以及对数组的互斥操作的测试程序
- #!/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';);
 
  复制代码 |