Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Perl: PERL threads

netman87 [02.01.2010 05:22:42]

#

Hei.

Viitsisikö kukaan kirjoittaa minulle mallia? Tahtoisin tietää miten tulisi hoitaa scripti joka etsisi uusia tiedostoja ja aina kun löytyisi uusi tiedosto se lisättäisin odottavien listaan. Odottettavien listalta otettaisin aina uusi tiedostokäsiteltäväksi niin että säikeiden määrä olisi maksimissaan vaikkapa 8.

Entä voinko jotenkin tunnistaa että säie X on valmis ja luoda uuden?
Jos esitin asiani epäselvästi niin kertoo niin voin yrittää selittää paremmin. Lisäksi aiheeseen liittyvät vinkit ovat tervetulleita.

Grez [02.01.2010 21:32:08]

#

Itaae tekisin varmaan vaan listan, jossa olisi tiedot tiedostoista ja lisäksi tieto siitä, onko ko. tiedosto jo käsittelyssä. Sitten käynnistäisin halutun määrän säikeitä jotka hakisivat aina listalta ensimmäisen tiedoston, jota ei vielä käsitellä. Kun säie saisi tiedoston käsiteltyä, se hakisi seuraavan. Sitten jos listalla ei olisi yhtään käsittelemätöntä, mutta lista ei olisi valmis, niin säie voisi mennä nukkumaan hetkeksi ja tarkistaa uudestaan kotvan kuluttua. Jos taas lista olisi valmis, säie lopettaisi itsensä.

netman87 [13.01.2010 12:52:07]

#

mutta kun sen pitäisi etsiä samalla löytyykö tiedostoja joita ei ole vielä käsitelty. levyltä siis. noh, kysytään yksinkertaisempi kysymys: miten voin lukea säikeen X tilan? eli onko sen suoritus lopetettu vai ei?

netman87 [13.01.2010 13:54:26]

#

Jahas. Löysinkin miten tuo toimii... Tosin kertokaapas jos teen jotain väärin.

#!/usr/bin/perl
use strict;
use Time::HiRes qw( usleep ); # Activate high resolution sleep
use threads; # Activate support of thread support
use threads::shared; # Activate support of shared variables

my $sum : shared = 0;  # Shared variable
my ($thr) = threads->new(\&add, 32); # Open function add as thread
my ($thr) = threads->new(\&add, 65); # Open function add as thread
my ($thr) = threads->new(\&add, 34); # Open function add as thread
my ($thr) = threads->new(\&add, 32); # Open function add as thread
my ($thr) = threads->new(\&add, 65); # Open function add as thread

sub add { # Function that add something to shared variable $sum
  my($number) = @_;
  $sum = $sum + $number;
  my $result = $number;
  my $status = 0;
  return ($status, $result); # Return statuscode and result
}

my $thr;
my @threads = threads->list; # Get list of threads
while (@threads != 0) { # Loop if there is open threads
  foreach $thr (@threads) { # Loop all threads
    if ($thr->tid && !threads::equal($thr, threads->self) && $thr->is_joinable()) { # If thread is joinable
      print "Joining thread(", $thr->tid() , "):\n"; # Print thread id
      my ($status, $returndata) = $thr->join(); # Join thread and catch answer
      print "$status: $returndata\n\n"; # Print answer
    }
  }
  usleep(100); # Sleep coz we dont wanna use too much cpu time
  @threads = threads->list; # Update threads list
}

print "SUM: $sum\n\n"; # Print sum

EDIT: tosiaan englannin hienoa kieltä en hirveän hyvin osaa ja tuo tuloksen kertomin oli ihan vaan kokeilu että älkää turhaan aikaanne tuhlatko jos kielioppivirheitä löytyy kommentoista

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta