sharing(共有)

interleaving の例において、MIKEとRISAはコインを別々に入れるが、二人で乾杯して同時に飲み始めるような場合はsharing(共有)を使う。
P[|{event}|]Q のように記述すると指定されたイベントで同期し、それ以外のイベントについては interleavingと同じく別々に起こす。

channel coin, coke, cider, lemonade, drink
MIKE = coin -> ( coke -> drink -> SKIP
                 |~|
                 cider -> drink -> SKIP )

RISA = coin -> lemonade -> drink -> SKIP

PEOPLE = MIKE |[{drink}]| RISA

 --    PEOPLEの実行例
 -- < coin(RISA),lemonade,coin(MIKE),cider,drink(RISA&MIKE) >

プロセスPEOPLE はMIKE と RISA のどちらが先にコインを入れてジュースを買うかはわからないが、drinkのイベントでは必ず同期する。イベントcoin はMIKEとRISAが別々に起こすので2度起きるが、drink は2人で同期するので1度しか起こらない。

sharingの同期するイベントを空とすると、interleaving に等しい。

P[|{}|]QP|||Q