Schrift
[thread]6867[/thread]

threads->join() zwingt Vater zu warten



<< >> 10 Einträge, 1 Seite
Froschpopo
 2005-04-07 22:21
#53537 #53537
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
ich hab folgendes kleines Script:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/usr/bin/perl

use strict;
use threads;


my $th_inc = threads->new( \&kind );

$th_inc->join();

sub kind {
    sleep(4);
    print "Kind ist fertig\n";
    exit;
}
print "Vater ist fertig\n";

Das Problem ist nun: Der Vater wartet aufs Kind anstatt direkt "Vater ist fertig" auszugeben. Da das sleep(4) ja nur im Kind stattfindet, müsste doch eigentlich zuerst der Vater fertig sein da dieser nicht schlafen muss.
Irgendwie scheint also join() den Vater zu blockieren. Kann man das irgendwie verhindern?

Ich möchte dass das Kind direkt schon zu scriptbeginn ausgeführt wird.\n\n

<!--EDIT|Froschpopo|1112898136-->
Ishka
 2005-04-07 22:58
#53538 #53538
User since
2003-08-04
771 Artikel
HausmeisterIn
[Homepage] [default_avatar]
naja, der Elternprozess wartet halt, bis entweder das Kind auch joint, oder das Kind sich beendet. Was sollte es deines Erachtens tun?

und verwende bitte 'use warnings;'
sub z{if(@_){1while$x[$k=rand 10];t($t=$x[$k]=1)}print map"$z[$x[$_]]$_".($_%3?
"":"\n"),1..9}sub t{$j=0;$x[$_+1]==$t&&($j+=2**$_)for 0..8;z,die"Gewinner $z[$t]
"if grep$_==($j&$_),7,56,73,84,146,273,292,448;z,die"Gleichstand\n"if@x>9&&!grep
!$_,@x}@x=4;@z=qw{. [ (};z$^T&1;while(<>){next if$_>9||$x[$_];t$t=$x[$_]=2;z 1}
Froschpopo
 2005-04-07 23:01
#53539 #53539
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
also sinn der sache soll eigentlich sein, dass das beide unabhängig voneinander sind, denn ansonsten kann ich ja auf threads verzichten wenn der vater nach zeugung des kindes nicht weitermachen kann....\n\n

<!--EDIT|Froschpopo|1112900566-->
esskar
 2005-04-07 23:17
#53540 #53540
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
lese mal bitte perldoc perlthrtut\n\n

<!--EDIT|esskar|1112901479-->
Froschpopo
 2005-04-07 23:33
#53541 #53541
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
das scheint am join zu liegen der den thread "einsammelt".
Aber der Thread wird ja auch ohne join() gestartet schon bei der erzeugung des Objekts,
deshalb wundert es mich, dass wenn ich das join weglasse, er nach "Vater ist fertig" keine 4 Sekunden auf den Thread wartet...  warum ? Theoretisch müsste der nach "Vater ist fertig" noch 4 Sekunden warten und dann erst ein exit machen\n\n

<!--EDIT|Froschpopo|1112902493-->
esskar
 2005-04-07 23:37
#53542 #53542
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
nee;
du kannst am schluss join benutzen, wenn du willst, dass alle threads abgearbeitet werden; wenn nicht, werden einfach alle threads abgebrochen, wenn der papa fertig ist...
sowas ist ganz normal!
Froschpopo
 2005-04-07 23:41
#53543 #53543
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
achso ist das :) danke ! Thema beendet!
Froschpopo
 2005-04-08 00:10
#53544 #53544
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
aus reiner neugierde hab ichs grad auch nochmal mit POE versucht:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#! /usr/bin/perl -w

use warnings;
use strict;
use POE qw(Session);


POE::Session->create( 'inline_states' =>
{ '_start' => \&test

}
);

sub test {
sleep(4);
print "Jetzt bin ich auch fertig\n";
}

POE::Kernel->run();

print "Vater ist Fertig\n";

sleep(7); # warten auf das kind

Warum schläft der 4 sekunden bevor er "Vater ist Fertig" ausgibt? Der muss doch weitermachen !! irgendwie krieg ich das nicht in meine Birne rein!
esskar
 2005-04-08 00:22
#53545 #53545
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
das ist doch jetzt was total anderes...
nimm threads; poe ist es nur eine "notlösung" weil es vorher noch keine threads gab!
ptk
 2005-04-08 12:39
#53546 #53546
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Das wuerde ich so nicht sagen: die gesamte Thread-Implementation unter perl5 ist eher eine Notloesung. Vor perl6 werde ich mit threads nicht anruehren.
<< >> 10 Einträge, 1 Seite



View all threads created 2005-04-07 22:21.