Maple Professionel
Maple Académique
Maple Edition Étudiant
Maple Personal Edition
Maple Player
Maple Player for iPad
MapleSim Professionel
MapleSim Académique
Maple T.A. - Suite d'examens de classement
Maple T.A. MAA Placement Test Suite
Möbius - Didacticiels de mathématiques en ligne
Machine Design / Industrial Automation
Aéronautique
Ingénierie des véhicules
Robotics
Energie
System Simulation and Analysis
Model development for HIL
Modélisation du procédé pour la conception de systèmes de contrôle
Robotics/Motion Control/Mechatronics
Other Application Areas
Enseignement des mathématiques
Enseignement de l’ingénierie
Enseignement secondaire et supérieur (CPGE, BTS)
Tests et évaluations
Etudiants
Modélisation financière
Recherche opérationnelle
Calcul haute performance
Physique
Webinaires en direct
Webinaires enregistrés
Agenda des évènements
Forum MaplePrimes
Blog Maplesoft
Membres Maplesoft
Maple Ambassador Program
MapleCloud
Livres blancs techniques
Bulletin électronique
Livres Maple
Math Matters
Portail des applications
Galerie de modèles MapleSim
Cas d'Etudes Utilisateur
Exploring Engineering Fundamentals
Concepts d’enseignement avec Maple
Centre d’accueil utilisateur Maplesoft
Centre de ressources pour enseignants
Centre d’assistance aux étudiants
Threads[ConditionVariable][Destroy] - 状態変数を破棄する
使い方
Destroy( condId1, condId2, ...)
パラメータ
condId* - 状態変数識別子 (整数)
説明
Destroy コマンドは引数で指定した状態変数を破棄します。
状態変数を作るには Create コマンドを使います。
状態変数の使い方の概要については Condition Variable を参照ください。
例
これは生産者 - 消費者 (Producer/Consume) パターンの例です。
生産者は物を生産します (ここでは大域テーブルのタブ内の整数で表します) 。消費者は物があればを消費し、結果をテーブルの最後に挿入します。
2 つの状態変数と 1 つのミューテックスを持ちます。1 つ目の状態変数 (cp) は生産者のスレッドとして使います。生産者スレッドは、仕事がいっぱいであれば生産者の状態変数は待機します。もう一つの状態変数 (cc) は消費者が使います。物がない場合、消費者スレッドは生産者が物を作るまで待機します。
ミューテックスは大域変数タブへのアクセスを制御するために使います。
Producer := proc( m, cp, cc, max, mindiff ) global tab, e; local i,j,n; Threads:-Mutex:-Lock( m ); j := 0; tab[ "maxjob" ] := mindiff; tab[ "curjob" ] := 1; for j from 1 to mindiff do tab[ j ] := 2*j; end do; Threads:-ConditionVariable:-Signal( cp ); Threads:-Mutex:-Unlock( m ); n := false; while ( e ) do Threads:-Mutex:-Lock( m ); j := tab[ "maxjob" ]; if ( j - tab[ "curjob" ] > mindiff/2 ) then n := true; Threads:-ConditionVariable:-Wait( cp, m ); end if; for i from j to tab[ "curjob" ] + mindiff do tab[ i ] := 2*i; end do; tab[ "maxjob" ] := tab[ "curjob" ] + mindiff; if ( n ) then Threads:-ConditionVariable:-Broadcast( cc ); n := false; end if; Threads:-Mutex:-Unlock( m ); end do; end proc:
Consumer := proc( m, cp, cc, max ) global tab, e; local n, i, j, num; num := 0; while ( num < max ) do Threads:-Mutex:-Lock( m ); while ( tab[ "curjob" ] = tab[ "maxjob" ] ) do Threads:-ConditionVariable:-Signal( cp ); Threads:-ConditionVariable:-Wait( cc, m ); end do; n := tab[ "curjob" ]; j := tab[ n ]; tab[ "curjob" ] := n + 1; Threads:-Mutex:-Unlock( m ); j := add( i, i=1..j ); num := num+1; Threads:-Mutex:-Lock( m ); tab[ n ] := j; Threads:-Mutex:-Unlock( m ); end do; end proc:
tab := table( ): m := Threads:-Mutex:-Create();
m := 1
cc := Threads:-ConditionVariable:-Create();
cc := 1
cp := Threads:-ConditionVariable:-Create();
cp := 2
e := true:
生産者スレッドをスタートします。生産者スレッドがスタートするまで cp は待機しています。
Threads:-Mutex:-Lock( m ); id1 := Threads:-Create( Producer( m, cp, cc, 31, 10 ) );
id1 := 1
Threads:-ConditionVariable:-Wait( cp, m ); Threads:-Mutex:-Unlock( m );
消費者スレッドをスタートします。毎回 100 個の物を消費し、5 つのスレッドで行うので 500 個の物を消費します。
id2 := [ seq( Threads:-Create( Consumer( m, cp, cc, 100 ) ), i=1..5 ) ];
id2 := [2, 3, 4, 5, 6]
終わるまで消費者スレッドを待機します。
Threads:-Wait( op( id2 ) ); Threads:-Mutex:-Lock( m );
生産者スレッドを終了します。
e := false: Threads:-ConditionVariable:-Signal( cp ); Threads:-Mutex:-Unlock( m ); Threads:-Wait( id1 );
仕事の数を調べます。
print( tab[ "curjob" ] );
501
仕事の結果を調べます。
print( tab[233] );
108811
print( add( i, i=1..2*233 ) );
参照
Threads, Threads[ConditionVariable][Broadcast], Threads[ConditionVariable][Create], Threads[ConditionVariable][Signal], Threads[ConditionVariable][Wait], Threads[Mutex]
Download Help Document