私はperlのスレッドの初心者です。
プロジェクトのリストを含むファイルがあり (各プロジェクトは別の行にあります)、それらのプロジェクトを並行してビルドしたいと考えています。現在、各スレッド:
- ファイルを「読み取り」モードで開きます
- いくつかのプロジェクト (= いくつかのファイル行) のリストを保存します
- ファイルを閉じます
- ファイルを再度開きます-「書き込み」モードとして
- 選択された行なしで書き直します
各スレッドがファイルにアクセスする唯一のスレッドであることを確認するために、セマフォを使用しようとしています。
何らかの理由で、スレッドの衝突が発生し、何が間違っているのかわかりません。
(各ビルドの現在の時刻も取得する「レポート」で)異なるスレッドが「共有」ファイルから同じプロジェクトを選択することがわかります(たまにしか発生しませんが、それでも..)
私の $semaphore 宣言が「私の」変数として合法であるかどうかさえわかりません。
どんな助けでも本当に感謝します!!
ありがとう。
ここに私のコードの一部があります:
my $semaphore = Thread::semaphore->new() ;
sub build_from_targets_list{
#...
open(REPORT, "+>$REPORT_tmp"); # Open for output
#....
@threads =();
for ($i = 0; $i < $number_of_cores; $i++){
my $thr = threads->new(\&compile_process, $i,*REPORT);
push @threads, $thr;
}
$_->join for @threads;
close (REPORT);
}
### Some stuff..
sub compile_process{
*REPORT = shift(@_);
#...
while (1){
$semaphore->down();
open (DATA_FILE, $shared_file);
flock(DATA_FILE, 2);
while ($record = <DATA_FILE>) {
chomp($record);
push(@temp_target_list,$record);
}
# ... choose some lines (=projects)...
# remove the projects that should be built by this thread:
for ($k = 0; $k < $num_of_targets_in_project; $k++){
shift(@temp_target_list);
}
close(DATA_FILE);
open (REWRITE,">$shared_file");
flock(REWRITE, 2);
seek(REWRITE, 0, 0);
foreach $temp_target (@temp_target_list){
print REWRITE "$temp_target\n";
}
close (REWRITE);
## ... BUILD selected projects...
$semaphore->up();
}
}