BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース Concurrent Basic – メッセージベースの並行性の宣言型言語

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

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

この記事に星をつける

おすすめ度
スタイル

BT