BT

Concurrent Basic – メッセージベースの並行性の宣言型言語

| 作者: Jonathan Allen フォローする 530 人のフォロワー , 翻訳者 編集部 フォローする 0 人のフォロワー 投稿日 2009年3月16日. 推定読書時間: 6 分 |

Concurrent Basicは、見込まれるVisual Basicの将来を表す。Polyphonic C#およびC-OmegaなどのC#研究言語で実行される作業に基づいているけれども、Visual Basicは宣言型プログラミングの本来備わっている傾向のため、白羽の矢が立った。その構文は、VBの宣言型イベントハンドラによって着想される。

キーワード

  • Asynchronous – メッセージキューを表すメソッド。
  • Synchronous – リクエストキューを表すメソッド。
  • When – AsynchronousおよびSynchronousイベントを相互につなぐために使用。

以下は、上記のキーワードを使用して実装されるスレッドセーフなバッファの完全なリストである。

Class Buffer(Of T) 
    Asynchronous Sub Put (t as T) 
    Synchronous Function Take() as T 
    Function React (t as T) as T When Put, Take 
        Return T 
    End Function 
End Class

関数Putは、非同期に呼び出すことができる。Take関数は、最低1つの保留Putが存在するまでブロックする。React関数は、Putを通じてキューされたオブジェクトを、Takeが期待するフォームに変換するという実装の詳細を扱う。

以下は、その2つの例である。最初の例はAまたはBにおいて、メッセージを待機する。2番目の例は、AおよびBの両方でメッセージがある限り待機する。

Class Either(Of T)
    Asynchronous Sub PutA(t as T) 
    Asynchronous Sub PutB(t as T) 
    Synchronous Function TakeEither() as T 
    Function ReactA(t as T) as T When TakeEither, PutA 
        Return T 
    End Function 
    Function ReactB(t as T) as T When TakeEither, PutB 
        Return T 
    End Function 
End Class 
Class Both(Of T, U) 
    Asynchronous Sub PutA(t as T) 
    Asynchronous Sub PutB(u of U) 
    Synchronous Function TakeBoth() as T 
    Function React(t as T, u as U) as Pair(Of T, U) When Take, PutA, PutB 
        Return new Pair(Of T, U)(t, u) 
    End Function 
End Class

次は、1つの場所のバッファに対するパターンであり、最大で同時に1つのメッセージを格納するバッファである。

Class OPB(of T) 
    Sub New 
        Empty() 
    End Sub 
    Synchronous Sub Put (t as T) 
    Synchronous Function Take() as T 
    Private Asynchronous Empty() 
    Private Asynchronous Full(of T) 
    Sub PutAndEmpty(t as T) When Put, Empty 
        Full(t) 
    End Sub 
    Sub TakeAndFull(t as T) as T When Take, Full 
        Empty() 
        Return t 
    End Sub 
End Class 

Put、Take、EmptyおよびFullは内部キューを表す。応答メソッドはWhenクラスとキューのサイズが一致するパターンで実行される。

これまで、それぞれの例はTakeメソッドが同期であることを前提としていた。しかしながら、そうである必要はなく、コールバックを使用することもできる。
 

Class AsyncBuffer(Of T) 
    Asynchronous Sub Put (t as T) 
    Asynchronous Function Take() as T 
    Function React (callback as Func(t as T), t as T) as T When Put, Take 
        Return callback(t) 
    End Function 
End Class 

 

このモデルを使用して、スレッドはReactおよびコールバック機能の処理をする。スレッドプール、GUIスレッドまたは他のスレッドライブラリなど別のことをしたいと考える人もいるかもしれない。そのためには、ContinuationAttributeを実装する必要がある。以下は、属性のベースクラスである。

Public MustInherit Class ContinuationAttribute 
    Inherits Attribute 
    Public MustOverride Sub BeginInvoke( task As Continuation) 
    Public MustOverride Sub Invoke( task As Continuation) 
End Class 
Public Delegate Sub Continuation() 

例および使用

Public Class MyThreadPoolAttribute 
    Inherits ContinuationAttribute 
    Public Overrides Sub BeginInvoke( task As Continuation) 
        ThreadPool.Enqueue(task) 
    End Sub 
    Public Overrides Sub Invoke( task As Continuation) 
        task() 
    End Sub 
End Class 

Class AsyncBuffer(Of T)
Asynchronous Sub Put (t as T)
Asynchronous Function Take() as T
Function React (callback as Func(t as T), t as T) as T When Put, Take
Return callback(t)
End Function
End Class

詳しくは、Channel 9のビデオ(リンク)およびConcurrent Basicの提案(PDF)を参照のこと。

 

原文はこちらです:http://www.infoq.com/news/2009/03/Concurrent-Basic

この記事に星をつける

おすすめ度
スタイル

こんにちは

コメントするには InfoQアカウントの登録 または が必要です。InfoQ に登録するとさまざまなことができます。

アカウント登録をしてInfoQをお楽しみください。

あなたの意見をお聞かせください。

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする
コミュニティコメント

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする

ディスカッション

InfoQにログインし新機能を利用する


パスワードを忘れた方はこちらへ

Follow

お気に入りのトピックや著者をフォローする

業界やサイト内で一番重要な見出しを閲覧する

Like

より多いシグナル、より少ないノイズ

お気に入りのトピックと著者を選択して自分のフィードを作る

Notifications

最新情報をすぐ手に入れるようにしよう

通知設定をして、お気に入りコンテンツを見逃さないようにしよう!

BT