Board logo

标题: [转帖]一个多线程,以及对数组的互斥操作的测试程序 [打印本页]

作者: cnangel    时间: 2004-12-7 18:42     标题: [转帖]一个多线程,以及对数组的互斥操作的测试程序

  1. #!/usr/bin/perl
  2. # 一个多线程,以及对数组的互斥操作的测试程序  战鹰
  3. use threads;
  4. use threads::shared;
  5. my @scalar;
  6. share(@scalar);#让该数组在线程间共享
  7. sub start_thread_1
  8. {
  9.    #程序主线程函数
  10.    my $id=shift;
  11.    for(1..50)
  12.    {
  13.       if($locked==0)
  14.       {
  15.          #这个条件判断没有实际用途,只不过是为了让Perl在if条件内的过程运行结束以后打开对共享数组的琐定
  16.          #您也可以注销这个条件判断,但您将得到一个完全不同的运行结果
  17.          lock(@scalar);#琐定共享数组
  18.          my $sc=rand(10);#获得一个随机数
  19.          push(@scalar,$sc);#将该随机数压入共享数组
  20.          print "$id:$sc\n";
  21.          cond_signal @scalar;#从阻塞队列中释放一个线程
  22.       }
  23.       sleep(1);
  24.    }
  25.    cond_signal @scalar;
  26. }
  27. sub start_thread_2
  28. {
  29.    my $id=shift;
  30.    while(1)
  31.    {
  32.       #进行无限循环,正常的程序中应尽量避免这种循环,否则线程将不能正常的结束
  33.       if(@scalar>0)
  34.       {
  35.          #如果共享数组内的元素个数大于0,则从中取出一个元素
  36.          lock(@scalar);
  37.          my $sc=shift @scalar;
  38.          print "$id:$sc\n";
  39.       }
  40.       else
  41.       {
  42.          #如果共享数组内的元素个数等于0,则将线程阻塞,直到主线程将其从阻塞队列中释放出来
  43.          lock(@scalar);
  44.          cond_wait @scalar;
  45.       }
  46.    }
  47. }
  48. #创建三个子线程
  49. my $thread_2 = threads->create("start_thread_2",1);
  50. my $thread_3 = threads->create("start_thread_2",2);
  51. my $thread_4 = threads->create("start_thread_2",3);
  52. #运行主线程
  53. start_thread_1(';main';);
复制代码





欢迎光临 星星博客 (http://commerce.huhoo.net/) Powered by Discuz! 7.0.0