fbpx
Wikipedia

Join-pattern

Join-patterns provides a way to write concurrent, parallel and distributed computer programs by message passing. Compared to the use of threads and locks, this is a high level programming model using communication constructs model to abstract the complexity of concurrent environment and to allow scalability. Its focus is on the execution of a chord between messages atomically consumed from a group of channels.

This template is based on join-calculus and uses pattern matching. Concretely, this is done by allowing the join definition of several functions and/or channels by matching concurrent call and messages patterns. It is a type of concurrency pattern because it makes easier and more flexible for these entities to communicate and deal with the multi-threaded programming paradigm.

Description edit

The join-pattern (or a chord in ) is like a super pipeline with synchronisation and matching. In fact, this concept is summarise by match and join a set of message available from different message queues, then handles them all simultaneously with one handler.[1] It could be represented by the keywords when to specify the first communication that we expected, with the and to join/pair other channels and the do to run some tasks with the different collected messages. A constructed join pattern typically takes this form:

j.When(a1).And(a2). ... .And(an).Do(d) 

Argument a1 of When(a1) may be a synchronous or asynchronous channel or an array of asynchronous channels. Each subsequent argument ai to And(ai) (for i > 1) must be an asynchronous channel.[2]

More precisely, when a message matches with a chain of linked patterns causes its handler to run (in a new thread if it's in asynchronous context) otherwise the message is queued until one of its patterns is enabled; if there are several matches, an unspecified pattern is selected.[3]

Unlike an event handler, which services one of several alternative events at a time, in conjunction with all other handlers on that event, a join pattern waits for a conjunction of channels and competes for execution with any other enabled pattern.[4]

 
This flow diagram shows how the join pattern is executed by a general match with different channels (wait a chord) and synchronizes the resources (free or lock).

Join-pattern is defined by a set of pi-calculus channels x that supports two different operations, sending and receiving, we need two join calculus names to implement it: a channel name x for sending (a message), and a function name x for receiving a value (a request). The meaning of the join definition is that a call to x() returns a value that was sent on a channel x<>. Each time functions are concurrently, triggers the return process and synchronizes with other joins.[5]

J ::= //join patterns | x<y> //message send pattern | x(y) //function call pattern | J | JBIS //synchronization 

From a client’s perspective, a channel just declares a method of the same name and signature. The client posts a message or issues a request by invoking the channel as a method. A continuation method must wait until/unless a single request or message has arrived on each of the channels following the continuation’s When clause. If the continuation gets to run, the arguments of each channel invocation are dequeued (thus consumed) and transferred (atomically) to the continuation’s parameters.[6]

 
Class diagram of the Join pattern

In most of cases, the order of synchronous calls is not guaranteed for performance reasons. Finally, during the match the messages available in the queue could be stolen by some intervening thread; indeed, the awakened thread may have to wait again.[7]

History edit

π-calculus – 1992 edit

The π-calculus belongs to the family of process calculi, allows mathematical formalisms for describing and analyzing properties of concurrent computation by using channel names to be communicated along the channels themselves, and in this way it is able to describe concurrent computations whose network configuration may change during the computation.

Join-Calculus – 1993 edit

Join patterns first appeared in Fournet and Gonthier’s foundational join-calculus, an asynchronous process algebra designed for efficient implementation in a distributed setting.[8] The join-calculus is a process calculus as expressive as the full π-calculus. It was developed to provide a formal basis for the design of distributed programming languages, and therefore intentionally avoids communications constructs found in other process calculi, such as rendezvous communications.

Distributed Join-Calculus – 1996 edit

The Join-Calculus is both a name passing calculus and a core language for concurrent and distributed programming.[9] That's why the Distributed Join-Calculus[10] based on the Join-Calculus with the distributed programming was created on 1996. This work use the mobile agents where agents are not only programs but core images of running processes with their communication capabilities.

JoCaml, Funnel and Join Java – 2000 edit

JoCaml[11][12] and Funnel[13][14] are functional languages supporting declarative join patterns. They present the ideas to direct implement a process calculi in a functional setting.

Another extensions to (non-generic) Java, JoinJava, were independently proposed by von Itzstein and Kearney.[15]

Polyphonic C# – 2002 edit

Cardelli, Benton and Fournet proposed an object-oriented version of join patterns for C# called Polyphonic C#.[16]

Cω – 2003 edit

Cω is adaptation of join-calculus to an object-oriented setting.[17] This variant of Polyphonic C# was included in the public release of Cω (a.k.a. Comega) in 2004.

Scala Joins – 2007 edit

Scala Joins is a library to use Join-Pattern with Scala in the context of extensible pattern matching in order to integrate joins into an existing actor-based concurrency framework.

JErlang – 2009 edit

Erlang is a language which natively supports the concurrent, real time and distributed paradigm. Concurrency between processes was complex, that's why the project build a new language, (J stands for Join) using based on the Join-calculus.

Join-pattern in classic programming literature edit

"Join-patterns can be used to easily encode related concurrency idioms like actors and active objects."[18]

class SymmetricBarrier {  public readonly Synchronous.Channel Arrive;  public SymmetricBarrier(int n)  {  // Create j and init channels (elided)  var pat = j.When(Arrive);  for (int i = 1; i < n; i++)  pat = pat.And(Arrive);  pat.Do(() => { });  } } 
var j = Join.Create(); Synchronous.Channel[] hungry; Asynchronous.Channel[] chopstick; j.Init(out hungry, n); j.Init(out chopstick, n); for (int i = 0; i < n; i++) {  var left = chopstick[i];  var right = chopstick[(i+1) % n];  j.When(hungry[i]).And(left).And(right).Do(() => {  eat();  left();  right(); // replace chopsticks  }); } 
class Lock {  public readonly Synchronous.Channel Acquire;  public readonly Asynchronous.Channel Release;  public Lock()  {  // Create j and init channels (elided)  j.When(Acquire).And(Release).Do(() => { });  Release(); // initially free  } } 
class Buffer<T> {  public readonly Asynchronous.Channel<T> Put;  public readonly Synchronous<T>.Channel Get;  public Buffer()  {  Join j = Join.Create(); // allocate a Join object  j.Init(out Put);  // bind its channels  j.Init(out Get);  j.When(Get).And(Put).Do // register chord  (t => { return t; });  } } 
class ReaderWriterLock {  private readonly Asynchronous.Channel idle;  private readonly Asynchronous.Channel<int> shared;  public readonly Synchronous.Channel AcqR, AcqW, RelR, RelW;  public ReaderWriterLock()  {  // Create j and init channels (elided)  j.When(AcqR).And(idle).Do(() => shared(1));  j.When(AcqR).And(shared).Do(n => shared(n+1));  j.When(RelR).And(shared).Do(n => {  if (n == 1)  {  idle();  }  else  {  shared(n-1);  }  });  j.When(AcqW).And(idle).Do(() => { });  j.When(RelW).Do(() => idle());  idle(); // initially free  } } 
class Semaphore {  public readonly Synchronous.Channel Acquire;  public readonly Asynchronous.Channel Release;  public Semaphore(int n)  {  // Create j and init channels (elided)  j.When(Acquire).And(Release).Do(() => { });  for (; n > 0; n--)  Release(); // initially n free  } } 

Fundamental features and concepts edit

  • Join-calculus : The first apparition of the Join-Pattern comes out with this process calculus.
  • Message passing : Join-pattern works with a message passing system for parallel reason.
  • Channel : Channels are used to synchronize and pass messages between concurrently executing threads. In general, a channel may be involved in more than one join pattern, each pattern defines a different continuation that may run when the channel is invoked .[6]
  • Synchronous : The join-pattern could use a synchronous channel which return a result. The continuation of a synchronous pattern runs in the thread of the synchronous sender.[6]
  • Asynchronous : It could also use an asynchronous channel which return no result but take arguments. The continuation of an asynchronous pattern runs in a newly spawned thread. A join pattern may be purely asynchronous, provided its continuation is a subroutine and its When clause only lists asynchronous channels.[6]
  • Combine synchronous and asynchronous : Merging the declarations of synchronous and asynchronous buffer would yield a module that supports the two communication type of consumers.[6]
  • Scheduler : There is a scheduling between join patterns (e.g. a round-robin scheduler, first-match scheduler).[6]
  • Design patterns : The join-pattern is first of all a behavioral and a concurrency pattern.
  • Concurrent programming : It's execute in a concurrent way.
  • Pattern matching : The join-pattern works with matching tasks.
  • Parallel programming : It performs tasks in parallel.
  • Distributed programming : Jobs could be scatter on different agent and environments with this pattern.
  • Software transactional memory : Software transactional memory (STM) is one of the possible implementation for the communications between joint.
  • Overlapping : The pattern could allow patterns declared on overlapping sets of channels.

Application domain edit

Mobile agent edit

A mobile agent is an autonomous software agent with a certain social ability and most importantly, mobility. It is composed of computer software and data which can move between different computers automatically while continuing their executions.

The mobile agents can be used to match concurrency and distribution if one uses the Join-calculus. That's why a new concept named "distributed Join-calculus" was created; it's an extension of Join-calculus with locations and primitives to describe the mobility. This innovation use agents as running processes with their communication capabilities to allow an idea of location, which is a physical site expressing the actual position of the agent. Thanks to the Join-calculus, one location can be moved atomically to another site.[23]

The processes of an agent is specified as a set which define its functionality including asynchronous emission of a message, migration to other location. Consequently, locations are organized in a tree to represent the movement of the agent easier. With this representation, a benefit of this solution is the possibility to create a simple model of failure. Usually a crash of a physical site causes the permanent failure of all its locations. But with the join-calculus a problem with a location can be detected at any other running location, allowing error recovery.[23]

So the Join-calculus is the core of a distributed programming language. In particular, the operational semantics is easily implementable in a distributed setting with failures. So the distributed join-calculus treats channel names and location names as first class values with lexical scopes. A location controls its own moves, and can only move towards a location whose name it has received. This provides a sound basis for static analysis and for secure mobility. This is complete for expressing distributed configurations. In the absence of failure, however, the execution of processes is independent of distribution. This location transparency is essential for the design of mobiles agents, and very helpful for checking their properties.[23]

In 2007, an extension of the basic join calculus with methods which make agents proactive has come out. The agents can observe an environment shared between them. With this environment, it is possible to define shared variables with all agents (e.g. a naming service to discover agents between themselves).[24]

Compilation edit

Join-languages are built on top of the join-calculus taken as a core language. So all the calculus are analysed with asynchronous processes and the join pattern provides a model to synchronize the result.[9]
To do this, it exists two Compilers:

  • Join Compiler: A compiler of a language named "join langage". This language has been created only for the join calculus
  • Jocaml Compiler 2005-10-01 at the Wayback Machine: A compiler of an extension of Objectif Caml created to use the join calculus.

This two compiler works with the same system, an automaton.

let A(n) | B() = P(n) and A(n) | C() = Q(n) ;; 

It represents the consumption of message arrive at a completed join model. Each state is a possibly step for the code execution and each transitions is the reception of a message to change between two steps. And so when all messages are grab, the compiler execute the body join code corresponding to the completed model joint.

So in the join-calculus, the basic values are the names like on the example is A,B or C. So the two compiler representing this values with two ways.
Join compiler use a vector with Two slots, the first to the name it-self and the second to a queue of pending messages.
Jocaml use name like a pointer on definitions. This definitions store the others pointer of the others names with a status field and a matching date structure by message.
The fundamental difference is when the guard process is executed, for the first, it was verify if all names are the pending messages ready whereas the second use only one variable and access at the others to know if the model is completed.[9]

Recent research describe the compilation scheme as the combination of two basic steps: dispatching and forwarding. The design and correctness of the dispatcher essentially stems from pattern matching theory, while inserting an internal forwarding step in communications is a natural idea, which intuitively does not change process behavior. They made the observation that the worth observing is a direct implementation of extended join-pattern matching at the runtime level would significantly complicate the management of message queues, which would then need to be scanned in search of matching messages before consuming them.[25]

Implementations and libraries edit

There are many uses of the Join-patterns with different languages. Some languages use join-patterns as a base of theirs implementations, for example the Polyphonic C# or MC# but others languages integrate join-pattern by a library like Scala Joins[26] for Scala or the Joins library for VB.[27] Moreover, the join-pattern is used through some languages like Scheme to upgrade the join-pattern.[28]

JErlang CB Joins Library Polyphonic C# Parallel C# Scala Joins F# Scheme Join Java Hume JoCaml
Patterns matching Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes
Scheduler between join-patterns Yes : first match Yes : first/round robin Yes Yes Yes Yes Yes Yes No Yes : random Yes : first/round robin Yes : random
Generics Yes Yes No No Yes Yes No No No No
Overriding No Yes Yes Yes Yes No Yes No No

Join Java edit

Join Java[29] is a language based on the Java programming language allowing the use of the join calculus. It introduces three new language constructs:

  • Join methods is defined by two or more Join fragments. A Join method will execute once all the fragments of the Join pattern have been called. If the return type is a standard Java type then the leading fragment will block the caller until the Join pattern is complete and the method has executed. If the return type is of type signal then the leading fragment will return immediately. All trailing fragments are asynchronous so will not block the caller.

Example:

class JoinExample {  int fragment1() & fragment2(int x) {  // Will return value of x to caller of fragment1  return x;  } } 
  • Asynchronous methods are defined by using the signal return type. This has the same characteristics as the void type except that the method will return immediately. When an asynchronous method is called a new thread is created to execute the body of the method.

Example:

class ThreadExample {  signal thread(SomeObject x) {  // This code will execute in a new thread  } } 
  • Ordering modifiers

Join fragments can be repeated in multiple Join patterns so there can be a case when multiple Join patterns are completed when a fragment is called. Such a case could occur in the example below if B(), C() and D() then A() are called. The final A() fragment completes three of the patterns so there are three possible methods that may be called. The ordered class modifier is used here to determine which Join method will be called. The default and when using the unordered class modifier is to pick one of the methods at random. With the ordered modifier the methods are prioritised according to the order they are declared.

Example:

class ordered SimpleJoinPattern {  void A() & B() {  }  void A() & C() {  }  void A() & D() {  }  signal D() & E() {  } } 

The closest related language is the Polyphonic C#.

JErlang edit

In Erlang coding synchronisation between multiple processes is not straightforward. That's why the JErlang,[30] an extension of Erlang was created, The J is for Join. Indeed, To overcome this limitation JErlang was implemented, a Join-Calculus inspired extension to Erlang. The features of this language are:

  • Joins allows first Match semantics and the possibility of having multiple patterns with a preservation of the messages's order.
operation() ->  receive  {ok, sum} and {val, X} and {val, Y} ->  {sum, X + Y};  {ok, mult} and {val, X} and {val, Y} ->  {mult, X * Y};  {ok, sub} and {val, X} and {val, Y} ->  {sub, X - Y};  end end 
  • Guards provides additional filtering not expressing in terms of patterns. Limited number of expression without side-effects
receive  {Transaction, M} and {limit, Lower, Upper}  when (Lower <= M and M <= Upper ) ->  commit_transaction(M, Transaction) end 
  • With Non-linear patterns, messages can match multiple joins
receive  {get, X} and {set, X} ->  {found, 2, X} end ... receive  {Pin, id} and {auth, Pin} and {commit, Id} ->  perform_transaction(Pin, Id) end 
  • propagation allows for copying correct messages instead of removing them.
receive  prop({session, Id}) and {act, Action, Id} ->  perform_action(Action, Id);  {session, Id} and {logout, Id} ->  logout_user(Id) end ... receive  {Pin, id} and {auth, Pin} and {commit, Id} ->  perform_transaction(Pin, Id) end 
  • Synchronous calls
receive  {accept, Pid1} and {asynchronous, Value}  and {accept, Pid2} ->  Pid1 ! {ok, Value},  Pid2 ! {ok, Value} end 

C++ edit

Yigong Liu has written some classes for the join pattern including all useful tools like asynchronous and synchronous channels, chords, etc. It's integrated in the project Boost c++.

template <typename V> class buffer: public joint { public:  async<V> put;  synch<V,void> get;  buffer() {  chord(get, put, &buffer::chord_body);  }  V chord_body(void_t g, V p) {  return p;  } }; 

This example shows us a thread safe buffer and message queue with the basic operations put and get.[31]

C# edit

Polyphonic C# edit

Polyphonic C# is an extension of the C# programming language. It introduces a new concurrency model with synchronous and asynchronous (which return control to the caller) methods and chords (also known as ‘synchronization patterns’ or ‘join patterns’).

public class Buffer {  public String get() & public async put(String s)  {  return s;  } } 

This is a simple buffer example.[32]

MC# edit

MC# language is an adaptation of the Polyphonic C# language for the case of concurrent distributed computations.

public handler Get2 long () & channel c1 (long x) & channel c2 (long y) {  return (x + y); } 

This example demonstrates the using of chords as a synchronization tool.

Parallel C# edit

Parallel C# is based Polyphonic C# and they add some new concepts like movables methods, high-order functions.

using System; class Test13 {  int Receive() & async Send(int x)  {  return x * x;  }  public static void Main(string[] args)  {  Test13 t = new Test13();  t.Send(2);  Console.WriteLine(t.Receive());  } } 

This example demonstrates how to use joins.[33]

edit

adds new language features to support concurrent programming (based on the earlier Polyphonic C#). The Joins Concurrency Library for C# and other .NET languages is derived of this project.[34][35]

Scalable Join Patterns edit

It's an easy to use declarative and scalable join-pattern library. In opposite to the Russo library,[27] it has no global lock. In fact, it's working with a compare-and-swap CAS and Atomic message system. The library[36] use three improvements for the join-pattern :

  • Stealing message for unused resources (allowing barging);
  • Lazy queue saves both on allocation and potentially on interprocessor communication by avoiding allocate or enqueue with an optimistic fast-path;
  • A status "WOKEN" : ensures that a blocked synchronous caller is woken only once.

JoCaml edit

JoCaml is the first language where the join-pattern was implemented. Indeed, at the beginning all the different implementation was compiled with the JoCaml Compiler. JoCaml language is an extension of the OCaml language. It extends OCaml with support for concurrency and synchronization, the distributed execution of programs, and the dynamic relocation of active program fragments during execution.[37]

type coins = Nickel | Dime and drinks = Coffee | Tea and buttons = BCoffee | BTea | BCancel;; (* def defines a Join-pattern set clause  * "&" in the left side of = means join (channel synchronism)  * "&" in the right hand side means: parallel process  * synchronous_reply :== "reply" [x] "to" channel_name  * synchronous channels have function-like types (`a -> `b)  * asynchronous channels have types (`a Join.chan)  * only the last statement in a pattern rhs expression can be an asynchronous message  * 0 in an asynchronous message position means STOP ("no sent message" in CSP terminology).  *) def put(s) = print_endline s ; 0 (* STOP *) ;; (* put: string Join.chan *) def serve(drink) = match drink with Coffee -> put("Cofee") | Tea -> put("Tea") ;; (* serve: drinks Join.chan *) def refund(v) = let s = Printf.sprintf "Refund %d" v in put(s) ;; (* refund: int Join.chan *) let new_vending serve refund = let vend (cost:int) (credit:int) = if credit >= cost then (true, credit - cost) else (false, credit) in def coin(Nickel) & value(v) = value(v+5) & reply () to coin or coin(Dime) & value(v) = value(v+10) & reply () to coin or button(BCoffee) & value(v) = let should_serve, remainder = vend 10 v in (if should_serve then serve(Coffee) else 0 (* STOP *)) & value(remainder) & reply () to button or button(BTea) & value(v) = let should_serve, remainder = vend 5 v in (if should_serve then serve(Tea) else 0 (* STOP *)) & value(remainder) & reply () to button or button(BCancel) & value(v) = refund( v) & value(0) & reply () to button in spawn value(0) ; coin, button (* coin, button: int -> unit *) ;; (* new_vending: drink Join.chan -> int Join.chan -> (int->unit)*(int->unit) *) let ccoin, cbutton = new_vending serve refund in ccoin(Nickel); ccoin(Nickel); ccoin(Dime); Unix.sleep(1); cbutton(BCoffee); Unix.sleep(1); cbutton(BTea); Unix.sleep(1); cbutton(BCancel); Unix.sleep(1) (* let the last message show up *) ;; 

gives

Coffee Tea Refund 5 

Hume edit

Hume[38] is a strict, strongly typed functional language for limited resources platforms, with concurrency based on asynchronous message passing, dataflow programming, and a Haskell like syntax.

Hume does not provide synchronous messaging.

It wraps a join-pattern set with a channel in common as a box, listing all channels in an in tuple and specifying all possible outputs in an out tuple.

Every join-pattern in the set must conform to the box input tuple type specifying a '*' for non required channels, giving an expression whose type conform to the output tuple, marking '*' the non fed outputs.

A wire clause specifies

  1. a tuple of corresponding input origins or sources and optionally start values
  2. a tuple of output destinations, being channels or sinks (stdout, ..).

A box can specify exception handlers with expressions conforming to the output tuple.

data Coins = Nickel | Dime; data Drinks = Coffee | Tea; data Buttons = BCoffee | BTea | BCancel; type Int = int 32 ; type String = string ; show u = u as string ; box coffee in ( coin :: Coins, button :: Buttons, value :: Int ) -- input channels out ( drink_outp :: String, value :: Int, refund_outp :: String) -- named outputs match -- * wildcards for unfilled outputs, and unconsumed inputs  ( Nickel, *, v) -> ( *, v + 5, *) | ( Dime, *, v) -> ( *, v + 10, *) | ( *, BCoffee, v) -> vend Coffee 10 v | ( *, BTea, v) -> vend Tea 5 v | ( *, BCancel, v) -> let refund u = "Refund " ++ show u ++ "\n"  in ( *, 0, refund v) ; vend drink cost credit = if credit >= cost  then ( serve drink, credit - cost, *)  else ( *, credit, *); serve drink = case drink of  Coffee -> "Cofee\n"  Tea -> "Tea\n" ; box control in (c :: char) out (coin :: Coins, button:: Buttons) match  'n' -> (Nickel, *)  | 'd' -> (Dime, *)  | 'c' -> (*, BCoffee)  | 't' -> (*, BTea)  | 'x' -> (*, BCancel)  | _ -> (*, *) ; stream console_outp to "std_out" ; stream console_inp from "std_in" ; -- dataflow wiring wire cofee  -- inputs (channel origins)  (control.coin, control.button, coffee.value initially 0)  -- outputs destinations  (console_outp, coffee.value, console_outp) ; wire control  (console_inp)  (coffee.coin, coffee.button) ; 

Visual Basic edit

Concurrent Basic – CB edit

An extension of Visual Basic 9.0 with asynchronous concurrency constructs, called Concurrent Basic (for short CB), offer the join patterns. CB (builds on earlier work on Polyphonic C#, Cω and the Joins Library) adopts a simple event-like syntax familiar to VB programmers, allows one to declare generic concurrency abstractions and provides more natural support for inheritance, enabling a subclass to augment the set of patterns. CB class can declare method to execute when communication has occurred on a particular set of local channels asynchronous and synchronous, forming a join pattern.[27]

Module Buffer  Public Asynchronous Put(ByVal s As String)  Public Synchronous Take() As String  Private Function CaseTakeAndPut(ByVal s As String) As String _  When Take, Put  Return s  End Function End Module 

This example shows all new keywords used by Concurrent Basic: Asynchronous, Synchronous and When.[39]

Joins library (C# and VB) edit

This library is a high-level abstractions of the Join Pattern using objects and generics. Channels are special delegate values from some common Join object (instead of methods).[40]

class Buffer {  public readonly Asynchronous.Channel<string> Put;  public readonly Synchronous<string>.Channel Get;  public Buffer()  {  Join join = Join.Create();  join.Initialize(out Put);  join.Initialize(out Get);  join.When(Get).And(Put).Do(delegate(string s) {  return s;  });  } } 

This example shows how to use methods of the Join object.[41]

Scala edit

There is a library in Scala called "Scala Joins" Scala Joins to use the Join-Pattern, it proposes to use pattern matching Pattern Matching as a tool for creating models of joins. You can find examples of the use of the join pattern in scala here: .

The pattern matching facilities of this language have been generalized to allow representation independence for objects used in pattern matching. So now it's possible to use a new type of abstraction in libraries. The advantage of join patterns is that they allow a declarative specification of the synchronization between different threads. Often, the join patterns corresponds closely to a finite state machine that specifies the valid states of the object.

In Scala, it's possible to solve many problem with the pattern matching and Scala Joins, for example the Reader-Writer.[26]

class ReaderWriterLock extends Joins {  private val Sharing = new AsyncEvent[Int]  val Exclusive, ReleaseExclusive = new NullarySyncEvent  val Shared, ReleaseShared = new NullarySyncEvent  join {  case Exclusive() & Sharing(0) => Exclusive reply  case ReleaseExclusive() => { Sharing(0); ReleaseExclusive reply }  case Shared() & Sharing(n) => { Sharing(n+1); Shared reply }  case ReleaseShared() & Sharing(1) => { Sharing(0); ReleaseShared reply }  case ReleaseShared() & Sharing(n) => { Sharing(n-1); ReleaseShared reply }  }  Sharing(0) } 

With a class we declare events in regular fields. So, it's possible to use the Join construct to enable a pattern matching via a list of case declarations. That list is representing by => with on each side a part of the declaration. The left-side is a model of join pattern to show the combinaison of events asynchronous and synchronous and the right-side is the body of join which is executed with the join model is completed.

In Scala, it's also possible to use the Scala's actor library[42] with the join pattern. For example, an unbounded buffer:[26]

val Put = new Join1[Int] val Get = new Join class Buffer extends JoinActor {  def act() {  receive { case Get() & Put(x) => Get reply x }  } } 

Actor-based concurrency is supported by means of a library and we provide join patterns as a library extension as well, so there are the opportunity to combine join patterns with the event-driven concurrency model offered by actors. Like you see in the example, it's the same way to use join pattern with actors, it just do it a list of case declaration in the method receive to show when the model is completed.

Practically the same tools are available in F# to use join pattern

Scala Join and Chymyst are newer implementations of the Join Pattern, improving upon Dr. Philipp Haller's .

Haskell edit

Join Language is an implementation of the Join Pattern in Haskell.

Scheme edit

The Join Patterns allows a new programming type especially for the multi-core architectures available in many programming situations with a high-levels of abstraction. This is based on the Guards and Propagation. So an example of this innovation has been implemented in Scheme .[28]

Guards is essential to guarantee that only data with a matching key is updated/retrieved. Propagation can cancel an item, reads its contents and puts backs an item into a store. Of course, the item is also in the store during the reading. The guards is expressed with shared variables. And so the novelty is that the join pattern can contains now propagated and simplified parts. So in Scheme, the part before / is propagated and the part after / is removed. The use of the Goal-Based is to divise the work in many tasks and joins all results at the end with the join pattern. A system named "MiniJoin" has implemented to use the intermediate result to solve the others tasks if it's possible. If is not possible it waits the solution of others tasks to solve itself.
So the concurrent join pattern application executed in parallel on a multi-core architecture doesn't guarantee that parallel execution lead to conflicts. To Guarantee this and a high degree of parallelism, a Software Transactional Memory (STM) within a highlytuned concurrent data structure based on atomic compare-and-swap (CAS) is use. This allows to run many concurrents operations in parallel on multi-core architecture. Moreover, an atomic execution is used to prevent the "false conflict" between CAS and STM.[28]

Other similar design patterns edit

Join Pattern is not the only pattern to perform multitasks but it's the only one that allow communication between resources, synchronization and join different processes.

  • Sequence pattern : consists of waiting that a task have completed to switch to another (the classic implementation).[43]
  • Split pattern (parallel split) : perform several tasks in parallel at the same time (e.g. Map reduce).[44]

See also edit

  • Join Java – Join Java is a programming language that extends the standard Java programming language
  • Joins (concurrency library) – Joins is an asynchronous concurrent computing API from Microsoft Research for the .NET Framework.
  • Join-calculus – The join-calculus was developed to provide a formal basis for the design of distributed programming languages.

References edit

  • Cédric, Fournet; Luc, Maranget (2006-08-15). "The Join-Calculus language". Institut National de Recherche en Informatique et Automatique. Retrieved 2012-10-09.
  • "JoinCalculus". Cunningham & Cunningham, Inc. October 25, 2009. Retrieved 2012-10-09.
  • Fournet, Cédric; Gonthier, Georges; Levy, Jean-Jacques; Maranget, Luc (1996). "A calculus of mobile agents". CONCUR '96: Concurrency Theory. Lecture Notes in Computer Science. Vol. 1119. Le Chesnay: Concurrency Theory. pp. 406–421. doi:10.1007/3-540-61604-7_67. ISBN 978-3-540-61604-7.
  • Maludzinski, Slawomir; Dobrowolski, Grzegorz (2007). "Agent Environment and Knowledge in Distributed Join Calculus". Multi-Agent Systems and Applications V. Lecture Notes in Computer Science. Vol. 4696. pp. 298–300. doi:10.1007/978-3-540-75254-7_30. ISBN 978-3-540-75253-0.
  • Russio, Claudio (2006). "The Joins Concurrency Library". Practical Aspects of Declarative Languages. Lecture Notes in Computer Science. Vol. 4354. Cambridge: Practical Aspects of Declarative Languages. pp. 260–274. CiteSeerX 10.1.1.187.8792. doi:10.1007/978-3-540-69611-7_17. ISBN 978-3-540-69608-7.
  • Maranget, Luc; Le Fessant, Fabrice (25 September 2007). "Compiling Join-Patterns". Le Chesnay France.
  • Haller, Phillip; Van Cutsem, Tom (2008). "Implementing Joins Using Extensible Pattern Matching". Coordination Models and Languages. Lecture Notes in Computer Science. Vol. 5052. Lausanne: Coordination Models and Languages. pp. 135–152. CiteSeerX 10.1.1.210.1242. doi:10.1007/978-3-540-68265-3_9. ISBN 978-3-540-68264-6.
  • Sulzmann, Martin; S. L. Lam, Edmund. "Parallel Join Patterns with Guards and Propagation". Denmark.
  • Fournet, Cédric; Gonthier, Georges (2002). "The Join Calculus: A Language for Distributed Mobile Programming". Applied Semantics. Lecture Notes in Computer Science. Vol. 2395. Springer. pp. 268–332. CiteSeerX 10.1.1.4.4788. doi:10.1007/3-540-45699-6_6. ISBN 978-3-540-44044-4.
  • Ma, Qin; Maranget, Luc (5 April 2004). "Compiling Pattern Matching in Join-Patterns". CONCUR 2004 - Concurrency Theory. Lecture Notes in Computer Science. Vol. 3170. INRIA. pp. 417–431. CiteSeerX 10.1.1.499.8443. doi:10.1007/978-3-540-28644-8_27. ISBN 978-3-540-22940-7. S2CID 9956643.
  • Singh, Satnam (6 January 2007). "Higher Order Combinators for Join Patterns using STM".
  • MONSIEUR, Geert (2010), Pattern-based Coordination in Process-based Service Compositions, Leuven Belgium: Katholiek Universiteit Leuven
  • Russo, Claudio V. (23 October 2008). "Join Patterns for Visual Basic". ACM SIGPLAN Notices. 43 (10): 53–72. doi:10.1145/1449955.1449770.
  • Aaron, Turon; Russo, Claudio V. (27 October 2011). Scalable Join Patterns (PDF). New York: Association for Computing Machinery. ISBN 978-1-4503-0940-0.
  • Guzev, Vadim B. (April 2008). "Parallel C#: The Usage of Chords and Higher-Order Functions in the Design of Parallel Programming Languages". Proceedings of the 2008 International Conference on Parallel and Distributed Processing Techniques and Applications, PDPTA 2008 (PDF). CSREA Press. ISBN 978-1601320841.

Notes edit

  1. ^ Taral Dragon (October 25, 2009). "Join Calculus".
  2. ^ Russo, Claudio V. (23 October 2008). "Join Patterns for Visual Basic". ACM SIGPLAN Notices. 43 (10): 10. doi:10.1145/1449955.1449770.
  3. ^ "Parallel C#".
  4. ^ Russo, Claudio V. (27 October 2008). "Join patterns for visual basic". ACM SIGPLAN Notices. 43 (10): 2. doi:10.1145/1449955.1449770.
  5. ^ Fournet, Cédric; Gonthier, Georges (2002). "The Join Calculus: A Language for Distributed Mobile Programming". Applied Semantics. Lecture Notes in Computer Science. Vol. 2395. Springer. pp. 268–332. CiteSeerX 10.1.1.4.4788. doi:10.1007/3-540-45699-6_6. ISBN 978-3-540-44044-4.
  6. ^ a b c d e f Russo, Claudio V. (27 October 2008). "Join patterns for visual basic". ACM SIGPLAN Notices. 43 (10): 53–72. doi:10.1145/1449955.1449770.
  7. ^ Russo, Claudio V. (23 October 2008). "Join Patterns for Visual Basic". ACM SIGPLAN Notices. 43 (10): 5. doi:10.1145/1449955.1449770.
  8. ^ Russo, Claudio V. (23 October 2008). "Join Patterns for Visual Basic". ACM SIGPLAN Notices. 43 (10): 18. doi:10.1145/1449955.1449770.
  9. ^ a b c Maranget, Luc; Le Fessant, Fabrice (25 September 2007). "Compiling Join-Patterns". Le Chesnay France.
  10. ^ Fournet, Cédric; Gonthier, Georges; Levy, Jean-Jacques; Maranget, Luc (1996). "A calculus of mobile agents". CONCUR '96: Concurrency Theory. Lecture Notes in Computer Science. Vol. 1119. Le Chesnay: Concurrency Theory. pp. 406–421. doi:10.1007/3-540-61604-7_67. ISBN 978-3-540-61604-7.
  11. ^ Fournet, Cedric; Le Fessant, Fabrice; Maranget, Luc; Schmitt, A. (2003). "JoCaml: A Language for Concurrent Distributed and Mobile Programming". Advanced Functional Programming. Lecture Notes in Computer Science. Vol. 2638. pp. 129–158. doi:10.1007/978-3-540-44833-4_5. ISBN 978-3-540-40132-2.
  12. ^ Conchon, S.; Le Fessant, F. (1999). "Jocaml: Mobile agents for Objective-Caml". Proceedings. First and Third International Symposium on Agent Systems Applications, and Mobile Agents. pp. 22–29. doi:10.1109/ASAMA.1999.805390. ISBN 0-7695-0342-X. S2CID 14355301.
  13. ^ Odersky, Martin (September 2000). "An overview of functional nets". Summer School, Caminha, Portugal, September 2000. 2395.
  14. ^ Odersky, Martin (2000). "Functional Nets". Programming Languages and Systems. Lecture Notes in Computer Science. Vol. 1782. pp. 1–25. doi:10.1007/3-540-46425-5_1. ISBN 978-3-540-67262-3.
  15. ^ Itzstein, G. S.; Kearney, D. (2001). "Join Java: An alternative concurrency semantics for Java". Technical Report ACRC-01-001, University of South Australia.
  16. ^ Benton, N.; Fournet, C. (June 2002). "Modern concurrency abstractions for C#". In Proceedings of the 16th European Conference on Object-Oriented Programming (ECOOP 2002), Number 2374 in LNCS.
  17. ^ Benton, N.; Cardelli, L. (2004). Modern Concurrency Abstractions for C#. ACM Transactions on Programming Languages and Systems. Vol. 26.
  18. ^ Singh, Satnam (6 January 2007). "Higher Order Combinators for Join Patterns using STM". p. 1.
  19. ^ a b Aaron, Turon; Russo, Claudio V. (27 October 2011). Scalable Join Patterns (PDF). New York: Association for Computing Machinery. p. 4. ISBN 978-1-4503-0940-0.
  20. ^ Aaron, Turon; Russo, Claudio V. (27 October 2011). Scalable Join Patterns (PDF). New York: Association for Computing Machinery. p. 1. ISBN 978-1-4503-0940-0.
  21. ^ a b Aaron, Turon; Russo, Claudio V. (27 October 2011). Scalable Join Patterns (PDF). New York: Association for Computing Machinery. p. 3. ISBN 978-1-4503-0940-0.
  22. ^ Aaron, Turon; Russo, Claudio V. (27 October 2011). Scalable Join Patterns (PDF). New York: Association for Computing Machinery. p. 2. ISBN 978-1-4503-0940-0.
  23. ^ a b c Fournet, Cédric; Gonthier, Georges; Levy, Jean-Jacques; Maranget, Luc; Remy, Didier (1996). "A calculus of mobile agents". CONCUR '96: Concurrency Theory. Lecture Notes in Computer Science. Vol. 1119. Le Chesnay: Concurrency Theory. pp. 406–421. doi:10.1007/3-540-61604-7_67. ISBN 978-3-540-61604-7.
  24. ^ Maludzinski, Slawomir; Dobrowolski, Grzegorz (2007). "Agent Environment and Knowledge in Distributed Join Calculus". Multi-Agent Systems and Applications V. Lecture Notes in Computer Science. Vol. 4696. pp. 298–300. doi:10.1007/978-3-540-75254-7_30. ISBN 978-3-540-75253-0.
  25. ^ Ma, Qin; Maranget, Luc (5 April 2004). "Compiling Pattern Matching in Join-Patterns". CONCUR 2004 - Concurrency Theory. Lecture Notes in Computer Science. Vol. 3170. INRIA. pp. 417–431. CiteSeerX 10.1.1.499.8443. doi:10.1007/978-3-540-28644-8_27. ISBN 978-3-540-22940-7. S2CID 9956643.
  26. ^ a b c Haller, Phillip; Van Cutsem, Tom (2008). "Implementing Joins Using Extensible Pattern Matching". Coordination Models and Languages. Lecture Notes in Computer Science. Vol. 5052. Lausanne: Coordination Models and Languages. pp. 135–152. CiteSeerX 10.1.1.210.1242. doi:10.1007/978-3-540-68265-3_9. ISBN 978-3-540-68264-6.
  27. ^ a b c Russo, Claudio V. (23 October 2008). "Join Patterns for Visual Basic". ACM SIGPLAN Notices. 43 (10): 53–72. doi:10.1145/1449955.1449770.
  28. ^ a b c Sulzmann, Martin; S. L. Lam, Edmund. "Parallel Join Patterns with Guards and Propagation". Denmark.
  29. ^ Hopf, J.; von Itzstein, G.; Stewart, al. (2002). Hardware Join Java: A High Level Language For Reconfigurable Hardware Development. Hong Kong: IEEE. Archived from the original on 2013-02-19.
  30. ^ Plociniczak, Hubert; Eisenbach, Susan (2010). "JErlang: Erlang with Joins". Coordination Models and Languages. Lecture Notes in Computer Science. Vol. 6116. Springer. pp. 61–75. Bibcode:2010LNCS.6116...61P. doi:10.1007/978-3-642-13414-2_5. ISBN 978-3-642-13413-5.
  31. ^ Liu, Yigong (2007–2009). "Join – Asynchronous Message Coordination and Concurrency Library".
  32. ^ "Introduction to Polyphonic C#".
  33. ^ . Archived from the original on 2013-11-26.
  34. ^ Hanus, Michael (January 2007). The Joins Concurrency Library. Vol. 4354. ISBN 978-3-540-69608-7.
  35. ^ "Comega".
  36. ^ Aaron, Turon; Russo, Claudio V. (27 October 2011). Scalable Join Patterns (PDF). New York: Association for Computing Machinery. ISBN 978-1-4503-0940-0.
  37. ^ Fournet, Cedric; Le Fessant, Fabrice; Maranget, Luc; Schmitt, Alan (2003). "JoCaml: a Language for Concurrent Distributed and Mobile Programming" (PDF). Advanced Functional Programming. Lecture Notes in Computer Science. Springer-Verlag. pp. 129–158.
  38. ^ Hammond/Michaelson/Sun – Programming reactive systems in Hume
  39. ^ . Archived from the original on 2015-04-25.
  40. ^ Russio, Claudio (2006). "The Joins Concurrency Library". Practical Aspects of Declarative Languages. Lecture Notes in Computer Science. Vol. 4354. Cambridge: Practical Aspects of Declarative Languages. pp. 260–274. CiteSeerX 10.1.1.187.8792. doi:10.1007/978-3-540-69611-7_17. ISBN 978-3-540-69608-7.
  41. ^ "The Joins Concurrency Library".
  42. ^ Haller, Phillip; Odersky, Martin (June 2007). "Actors that unify threads and events". Coordination Models and Languages. Lecture Notes in Computer Science. Vol. 4467. Springer. pp. 171–190. doi:10.1007/978-3-540-72794-1_10. ISBN 978-3-540-72793-4.
  43. ^ MONSIEUR, Geert (2010), Pattern-based Coordination in Process-based Service Compositions, Leuven Belgium: Katholiek Universiteit Leuven, p. 68
  44. ^ MONSIEUR, Geert (2010), Pattern-based Coordination in Process-based Service Compositions, Leuven Belgium: Katholiek Universiteit Leuven, p. 70

External links edit

  • The Joins Concurrency Library
  • INRIA, Join Calculus homepage

join, pattern, this, article, technical, most, readers, understand, please, help, improve, make, understandable, experts, without, removing, technical, details, january, 2013, learn, when, remove, this, template, message, provides, write, concurrent, parallel,. This article may be too technical for most readers to understand Please help improve it to make it understandable to non experts without removing the technical details January 2013 Learn how and when to remove this template message Join patterns provides a way to write concurrent parallel and distributed computer programs by message passing Compared to the use of threads and locks this is a high level programming model using communication constructs model to abstract the complexity of concurrent environment and to allow scalability Its focus is on the execution of a chord between messages atomically consumed from a group of channels Join patternParadigmconcurrent computing distributed programmingDeveloperINRIA InriaWebsiteInria JoinMajor implementationsJoin Java Polyphonic C Unified Parallel C Cw Joins library Boost InfluencedJoin CalculusThis template is based on join calculus and uses pattern matching Concretely this is done by allowing the join definition of several functions and or channels by matching concurrent call and messages patterns It is a type of concurrency pattern because it makes easier and more flexible for these entities to communicate and deal with the multi threaded programming paradigm Contents 1 Description 2 History 2 1 p calculus 1992 2 2 Join Calculus 1993 2 3 Distributed Join Calculus 1996 2 4 JoCaml Funnel and Join Java 2000 2 5 Polyphonic C 2002 2 6 Cw 2003 2 7 Scala Joins 2007 2 8 JErlang 2009 3 Join pattern in classic programming literature 4 Fundamental features and concepts 5 Application domain 5 1 Mobile agent 5 2 Compilation 6 Implementations and libraries 6 1 Join Java 6 2 JErlang 6 3 C 6 4 C 6 4 1 Polyphonic C 6 4 2 MC 6 4 3 Parallel C 6 4 4 Cw 6 4 5 Scalable Join Patterns 6 5 JoCaml 6 6 Hume 6 7 Visual Basic 6 7 1 Concurrent Basic CB 6 8 Joins library C and VB 6 9 Scala 6 10 Haskell 6 11 Scheme 7 Other similar design patterns 8 See also 9 References 10 Notes 11 External linksDescription editThe join pattern or a chord in Cw is like a super pipeline with synchronisation and matching In fact this concept is summarise by match and join a set of message available from different message queues then handles them all simultaneously with one handler 1 It could be represented by the keywords when to specify the first communication that we expected with the and to join pair other channels and the do to run some tasks with the different collected messages A constructed join pattern typically takes this form j When a1 And a2 And an Do d Argument a1 of When a1 may be a synchronous or asynchronous channel or an array of asynchronous channels Each subsequent argument ai to And ai for i gt 1 must be an asynchronous channel 2 More precisely when a message matches with a chain of linked patterns causes its handler to run in a new thread if it s in asynchronous context otherwise the message is queued until one of its patterns is enabled if there are several matches an unspecified pattern is selected 3 Unlike an event handler which services one of several alternative events at a time in conjunction with all other handlers on that event a join pattern waits for a conjunction of channels and competes for execution with any other enabled pattern 4 nbsp This flow diagram shows how the join pattern is executed by a general match with different channels wait a chord and synchronizes the resources free or lock Join pattern is defined by a set of pi calculus channels x that supports two different operations sending and receiving we need two join calculus names to implement it a channel name x for sending a message and a function name x for receiving a value a request The meaning of the join definition is that a call to x returns a value that was sent on a channel x lt gt Each time functions are concurrently triggers the return process and synchronizes with other joins 5 J join patterns x lt y gt message send pattern x y function call pattern J JBIS synchronization From a client s perspective a channel just declares a method of the same name and signature The client posts a message or issues a request by invoking the channel as a method A continuation method must wait until unless a single request or message has arrived on each of the channels following the continuation s When clause If the continuation gets to run the arguments of each channel invocation are dequeued thus consumed and transferred atomically to the continuation s parameters 6 nbsp Class diagram of the Join patternIn most of cases the order of synchronous calls is not guaranteed for performance reasons Finally during the match the messages available in the queue could be stolen by some intervening thread indeed the awakened thread may have to wait again 7 History editp calculus 1992 edit The p calculus belongs to the family of process calculi allows mathematical formalisms for describing and analyzing properties of concurrent computation by using channel names to be communicated along the channels themselves and in this way it is able to describe concurrent computations whose network configuration may change during the computation Join Calculus 1993 edit Join patterns first appeared in Fournet and Gonthier s foundational join calculus an asynchronous process algebra designed for efficient implementation in a distributed setting 8 The join calculus is a process calculus as expressive as the full p calculus It was developed to provide a formal basis for the design of distributed programming languages and therefore intentionally avoids communications constructs found in other process calculi such as rendezvous communications Distributed Join Calculus 1996 edit The Join Calculus is both a name passing calculus and a core language for concurrent and distributed programming 9 That s why the Distributed Join Calculus 10 based on the Join Calculus with the distributed programming was created on 1996 This work use the mobile agents where agents are not only programs but core images of running processes with their communication capabilities JoCaml Funnel and Join Java 2000 edit JoCaml 11 12 and Funnel 13 14 are functional languages supporting declarative join patterns They present the ideas to direct implement a process calculi in a functional setting Another extensions to non generic Java JoinJava were independently proposed by von Itzstein and Kearney 15 Polyphonic C 2002 edit Cardelli Benton and Fournet proposed an object oriented version of join patterns for C called Polyphonic C 16 Cw 2003 edit Cw is adaptation of join calculus to an object oriented setting 17 This variant of Polyphonic C was included in the public release of Cw a k a Comega in 2004 Scala Joins 2007 edit Scala Joins is a library to use Join Pattern with Scala in the context of extensible pattern matching in order to integrate joins into an existing actor based concurrency framework JErlang 2009 edit Erlang is a language which natively supports the concurrent real time and distributed paradigm Concurrency between processes was complex that s why the project build a new language JErlang J stands for Join using based on the Join calculus Join pattern in classic programming literature edit Join patterns can be used to easily encode related concurrency idioms like actors and active objects 18 Barriers 19 class SymmetricBarrier public readonly Synchronous Channel Arrive public SymmetricBarrier int n Create j and init channels elided var pat j When Arrive for int i 1 i lt n i pat pat And Arrive pat Do gt Dining philosophers problem 20 var j Join Create Synchronous Channel hungry Asynchronous Channel chopstick j Init out hungry n j Init out chopstick n for int i 0 i lt n i var left chopstick i var right chopstick i 1 n j When hungry i And left And right Do gt eat left right replace chopsticks Mutual exclusion 21 class Lock public readonly Synchronous Channel Acquire public readonly Asynchronous Channel Release public Lock Create j and init channels elided j When Acquire And Release Do gt Release initially free Producers Consumers 22 class Buffer lt T gt public readonly Asynchronous Channel lt T gt Put public readonly Synchronous lt T gt Channel Get public Buffer Join j Join Create allocate a Join object j Init out Put bind its channels j Init out Get j When Get And Put Do register chord t gt return t Reader writer locking 19 class ReaderWriterLock private readonly Asynchronous Channel idle private readonly Asynchronous Channel lt int gt shared public readonly Synchronous Channel AcqR AcqW RelR RelW public ReaderWriterLock Create j and init channels elided j When AcqR And idle Do gt shared 1 j When AcqR And shared Do n gt shared n 1 j When RelR And shared Do n gt if n 1 idle else shared n 1 j When AcqW And idle Do gt j When RelW Do gt idle idle initially free Semaphores 21 class Semaphore public readonly Synchronous Channel Acquire public readonly Asynchronous Channel Release public Semaphore int n Create j and init channels elided j When Acquire And Release Do gt for n gt 0 n Release initially n free Fundamental features and concepts editJoin calculus The first apparition of the Join Pattern comes out with this process calculus Message passing Join pattern works with a message passing system for parallel reason Channel Channels are used to synchronize and pass messages between concurrently executing threads In general a channel may be involved in more than one join pattern each pattern defines a different continuation that may run when the channel is invoked 6 Synchronous The join pattern could use a synchronous channel which return a result The continuation of a synchronous pattern runs in the thread of the synchronous sender 6 Asynchronous It could also use an asynchronous channel which return no result but take arguments The continuation of an asynchronous pattern runs in a newly spawned thread A join pattern may be purely asynchronous provided its continuation is a subroutine and its When clause only lists asynchronous channels 6 Combine synchronous and asynchronous Merging the declarations of synchronous and asynchronous buffer would yield a module that supports the two communication type of consumers 6 Scheduler There is a scheduling between join patterns e g a round robin scheduler first match scheduler 6 Design patterns The join pattern is first of all a behavioral and a concurrency pattern Concurrent programming It s execute in a concurrent way Pattern matching The join pattern works with matching tasks Parallel programming It performs tasks in parallel Distributed programming Jobs could be scatter on different agent and environments with this pattern Software transactional memory Software transactional memory STM is one of the possible implementation for the communications between joint Overlapping The pattern could allow patterns declared on overlapping sets of channels Application domain editMobile agent edit A mobile agent is an autonomous software agent with a certain social ability and most importantly mobility It is composed of computer software and data which can move between different computers automatically while continuing their executions The mobile agents can be used to match concurrency and distribution if one uses the Join calculus That s why a new concept named distributed Join calculus was created it s an extension of Join calculus with locations and primitives to describe the mobility This innovation use agents as running processes with their communication capabilities to allow an idea of location which is a physical site expressing the actual position of the agent Thanks to the Join calculus one location can be moved atomically to another site 23 The processes of an agent is specified as a set which define its functionality including asynchronous emission of a message migration to other location Consequently locations are organized in a tree to represent the movement of the agent easier With this representation a benefit of this solution is the possibility to create a simple model of failure Usually a crash of a physical site causes the permanent failure of all its locations But with the join calculus a problem with a location can be detected at any other running location allowing error recovery 23 So the Join calculus is the core of a distributed programming language In particular the operational semantics is easily implementable in a distributed setting with failures So the distributed join calculus treats channel names and location names as first class values with lexical scopes A location controls its own moves and can only move towards a location whose name it has received This provides a sound basis for static analysis and for secure mobility This is complete for expressing distributed configurations In the absence of failure however the execution of processes is independent of distribution This location transparency is essential for the design of mobiles agents and very helpful for checking their properties 23 In 2007 an extension of the basic join calculus with methods which make agents proactive has come out The agents can observe an environment shared between them With this environment it is possible to define shared variables with all agents e g a naming service to discover agents between themselves 24 Compilation edit Join languages are built on top of the join calculus taken as a core language So all the calculus are analysed with asynchronous processes and the join pattern provides a model to synchronize the result 9 To do this it exists two Compilers Join Compiler A compiler of a language named join langage This language has been created only for the join calculus Jocaml Compiler Archived 2005 10 01 at the Wayback Machine A compiler of an extension of Objectif Caml created to use the join calculus This two compiler works with the same system an automaton let A n B P n and A n C Q n It represents the consumption of message arrive at a completed join model Each state is a possibly step for the code execution and each transitions is the reception of a message to change between two steps And so when all messages are grab the compiler execute the body join code corresponding to the completed model joint So in the join calculus the basic values are the names like on the example is A B or C So the two compiler representing this values with two ways Join compiler use a vector with Two slots the first to the name it self and the second to a queue of pending messages Jocaml use name like a pointer on definitions This definitions store the others pointer of the others names with a status field and a matching date structure by message The fundamental difference is when the guard process is executed for the first it was verify if all names are the pending messages ready whereas the second use only one variable and access at the others to know if the model is completed 9 Recent research describe the compilation scheme as the combination of two basic steps dispatching and forwarding The design and correctness of the dispatcher essentially stems from pattern matching theory while inserting an internal forwarding step in communications is a natural idea which intuitively does not change process behavior They made the observation that the worth observing is a direct implementation of extended join pattern matching at the runtime level would significantly complicate the management of message queues which would then need to be scanned in search of matching messages before consuming them 25 Implementations and libraries editThere are many uses of the Join patterns with different languages Some languages use join patterns as a base of theirs implementations for example the Polyphonic C or MC but others languages integrate join pattern by a library like Scala Joins 26 for Scala or the Joins library for VB 27 Moreover the join pattern is used through some languages like Scheme to upgrade the join pattern 28 JErlang CB Joins Library Polyphonic C Parallel C Cw Scala Joins F Scheme Join Java Hume JoCamlPatterns matching Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes YesScheduler between join patterns Yes first match Yes first round robin Yes Yes Yes Yes Yes Yes No Yes random Yes first round robin Yes randomGenerics Yes Yes No No Yes Yes No No No NoOverriding No Yes Yes Yes Yes No Yes No NoJoin Java edit Join Java 29 is a language based on the Java programming language allowing the use of the join calculus It introduces three new language constructs Join methods is defined by two or more Join fragments A Join method will execute once all the fragments of the Join pattern have been called If the return type is a standard Java type then the leading fragment will block the caller until the Join pattern is complete and the method has executed If the return type is of type signal then the leading fragment will return immediately All trailing fragments are asynchronous so will not block the caller Example class JoinExample int fragment1 amp fragment2 int x Will return value of x to caller of fragment1 return x Asynchronous methods are defined by using the signal return type This has the same characteristics as the void type except that the method will return immediately When an asynchronous method is called a new thread is created to execute the body of the method Example class ThreadExample signal thread SomeObject x This code will execute in a new thread Ordering modifiersJoin fragments can be repeated in multiple Join patterns so there can be a case when multiple Join patterns are completed when a fragment is called Such a case could occur in the example below if B C and D then A are called The final A fragment completes three of the patterns so there are three possible methods that may be called The ordered class modifier is used here to determine which Join method will be called The default and when using the unordered class modifier is to pick one of the methods at random With the ordered modifier the methods are prioritised according to the order they are declared Example class ordered SimpleJoinPattern void A amp B void A amp C void A amp D signal D amp E The closest related language is the Polyphonic C JErlang edit In Erlang coding synchronisation between multiple processes is not straightforward That s why the JErlang 30 an extension of Erlang was created The J is for Join Indeed To overcome this limitation JErlang was implemented a Join Calculus inspired extension to Erlang The features of this language are Joins allows first Match semantics and the possibility of having multiple patterns with a preservation of the messages s order operation gt receive ok sum and val X and val Y gt sum X Y ok mult and val X and val Y gt mult X Y ok sub and val X and val Y gt sub X Y end end Guards provides additional filtering not expressing in terms of patterns Limited number of expression without side effectsreceive Transaction M and limit Lower Upper when Lower lt M and M lt Upper gt commit transaction M Transaction end With Non linear patterns messages can match multiple joinsreceive get X and set X gt found 2 X end receive Pin id and auth Pin and commit Id gt perform transaction Pin Id end propagation allows for copying correct messages instead of removing them receive prop session Id and act Action Id gt perform action Action Id session Id and logout Id gt logout user Id end receive Pin id and auth Pin and commit Id gt perform transaction Pin Id end Synchronous callsreceive accept Pid1 and asynchronous Value and accept Pid2 gt Pid1 ok Value Pid2 ok Value end C edit Yigong Liu has written some classes for the join pattern including all useful tools like asynchronous and synchronous channels chords etc It s integrated in the project Boost c template lt typename V gt class buffer public joint public async lt V gt put synch lt V void gt get buffer chord get put amp buffer chord body V chord body void t g V p return p This example shows us a thread safe buffer and message queue with the basic operations put and get 31 C edit Polyphonic C edit Polyphonic C is an extension of the C programming language It introduces a new concurrency model with synchronous and asynchronous which return control to the caller methods and chords also known as synchronization patterns or join patterns public class Buffer public String get amp public async put String s return s This is a simple buffer example 32 MC edit MC language is an adaptation of the Polyphonic C language for the case of concurrent distributed computations public handler Get2 long amp channel c1 long x amp channel c2 long y return x y This example demonstrates the using of chords as a synchronization tool Parallel C edit Parallel C is based Polyphonic C and they add some new concepts like movables methods high order functions using System class Test13 int Receive amp async Send int x return x x public static void Main string args Test13 t new Test13 t Send 2 Console WriteLine t Receive This example demonstrates how to use joins 33 Cw edit Cw adds new language features to support concurrent programming based on the earlier Polyphonic C The Joins Concurrency Library for C and other NET languages is derived of this project 34 35 Scalable Join Patterns edit It s an easy to use declarative and scalable join pattern library In opposite to the Russo library 27 it has no global lock In fact it s working with a compare and swap CAS and Atomic message system The library 36 use three improvements for the join pattern Stealing message for unused resources allowing barging Lazy queue saves both on allocation and potentially on interprocessor communication by avoiding allocate or enqueue with an optimistic fast path A status WOKEN ensures that a blocked synchronous caller is woken only once JoCaml edit JoCaml is the first language where the join pattern was implemented Indeed at the beginning all the different implementation was compiled with the JoCaml Compiler JoCaml language is an extension of the OCaml language It extends OCaml with support for concurrency and synchronization the distributed execution of programs and the dynamic relocation of active program fragments during execution 37 type coins Nickel Dime and drinks Coffee Tea and buttons BCoffee BTea BCancel def defines a Join pattern set clause amp in the left side of means join channel synchronism amp in the right hand side means parallel process synchronous reply reply x to channel name synchronous channels have function like types a gt b asynchronous channels have types a Join chan only the last statement in a pattern rhs expression can be an asynchronous message 0 in an asynchronous message position means STOP no sent message in CSP terminology def put s print endline s 0 STOP put string Join chan def serve drink match drink with Coffee gt put Cofee Tea gt put Tea serve drinks Join chan def refund v let s Printf sprintf Refund d v in put s refund int Join chan let new vending serve refund let vend cost int credit int if credit gt cost then true credit cost else false credit in def coin Nickel amp value v value v 5 amp reply to coin or coin Dime amp value v value v 10 amp reply to coin or button BCoffee amp value v let should serve remainder vend 10 v in if should serve then serve Coffee else 0 STOP amp value remainder amp reply to button or button BTea amp value v let should serve remainder vend 5 v in if should serve then serve Tea else 0 STOP amp value remainder amp reply to button or button BCancel amp value v refund v amp value 0 amp reply to button in spawn value 0 coin button coin button int gt unit new vending drink Join chan gt int Join chan gt int gt unit int gt unit let ccoin cbutton new vending serve refund in ccoin Nickel ccoin Nickel ccoin Dime Unix sleep 1 cbutton BCoffee Unix sleep 1 cbutton BTea Unix sleep 1 cbutton BCancel Unix sleep 1 let the last message show up gives Coffee Tea Refund 5 Hume edit Hume 38 is a strict strongly typed functional language for limited resources platforms with concurrency based on asynchronous message passing dataflow programming and a Haskell like syntax Hume does not provide synchronous messaging It wraps a join pattern set with a channel in common as a box listing all channels in an in tuple and specifying all possible outputs in an out tuple Every join pattern in the set must conform to the box input tuple type specifying a for non required channels giving an expression whose type conform to the output tuple marking the non fed outputs A wire clause specifies a tuple of corresponding input origins or sources and optionally start values a tuple of output destinations being channels or sinks stdout A box can specify exception handlers with expressions conforming to the output tuple data Coins Nickel Dime data Drinks Coffee Tea data Buttons BCoffee BTea BCancel type Int int 32 type String string show u u as string box coffee in coin Coins button Buttons value Int input channels out drink outp String value Int refund outp String named outputs match wildcards for unfilled outputs and unconsumed inputs Nickel v gt v 5 Dime v gt v 10 BCoffee v gt vend Coffee 10 v BTea v gt vend Tea 5 v BCancel v gt let refund u Refund show u n in 0 refund v vend drink cost credit if credit gt cost then serve drink credit cost else credit serve drink case drink of Coffee gt Cofee n Tea gt Tea n box control in c char out coin Coins button Buttons match n gt Nickel d gt Dime c gt BCoffee t gt BTea x gt BCancel gt stream console outp to std out stream console inp from std in dataflow wiring wire cofee inputs channel origins control coin control button coffee value initially 0 outputs destinations console outp coffee value console outp wire control console inp coffee coin coffee button Visual Basic edit Concurrent Basic CB edit An extension of Visual Basic 9 0 with asynchronous concurrency constructs called Concurrent Basic for short CB offer the join patterns CB builds on earlier work on Polyphonic C Cw and the Joins Library adopts a simple event like syntax familiar to VB programmers allows one to declare generic concurrency abstractions and provides more natural support for inheritance enabling a subclass to augment the set of patterns CB class can declare method to execute when communication has occurred on a particular set of local channels asynchronous and synchronous forming a join pattern 27 Module Buffer Public Asynchronous Put ByVal s As String Public Synchronous Take As String Private Function CaseTakeAndPut ByVal s As String As String When Take Put Return s End Function End Module This example shows all new keywords used by Concurrent Basic Asynchronous Synchronous and When 39 Joins library C and VB edit This library is a high level abstractions of the Join Pattern using objects and generics Channels are special delegate values from some common Join object instead of methods 40 class Buffer public readonly Asynchronous Channel lt string gt Put public readonly Synchronous lt string gt Channel Get public Buffer Join join Join Create join Initialize out Put join Initialize out Get join When Get And Put Do delegate string s return s This example shows how to use methods of the Join object 41 Scala edit There is a library in Scala called Scala Joins Scala Joins to use the Join Pattern it proposes to use pattern matching Pattern Matching as a tool for creating models of joins You can find examples of the use of the join pattern in scala here Join definitions in Scala The pattern matching facilities of this language have been generalized to allow representation independence for objects used in pattern matching So now it s possible to use a new type of abstraction in libraries The advantage of join patterns is that they allow a declarative specification of the synchronization between different threads Often the join patterns corresponds closely to a finite state machine that specifies the valid states of the object In Scala it s possible to solve many problem with the pattern matching and Scala Joins for example the Reader Writer 26 class ReaderWriterLock extends Joins private val Sharing new AsyncEvent Int val Exclusive ReleaseExclusive new NullarySyncEvent val Shared ReleaseShared new NullarySyncEvent join case Exclusive amp Sharing 0 gt Exclusive reply case ReleaseExclusive gt Sharing 0 ReleaseExclusive reply case Shared amp Sharing n gt Sharing n 1 Shared reply case ReleaseShared amp Sharing 1 gt Sharing 0 ReleaseShared reply case ReleaseShared amp Sharing n gt Sharing n 1 ReleaseShared reply Sharing 0 With a class we declare events in regular fields So it s possible to use the Join construct to enable a pattern matching via a list of case declarations That list is representing by gt with on each side a part of the declaration The left side is a model of join pattern to show the combinaison of events asynchronous and synchronous and the right side is the body of join which is executed with the join model is completed In Scala it s also possible to use the Scala s actor library 42 with the join pattern For example an unbounded buffer 26 val Put new Join1 Int val Get new Join class Buffer extends JoinActor def act receive case Get amp Put x gt Get reply x Actor based concurrency is supported by means of a library and we provide join patterns as a library extension as well so there are the opportunity to combine join patterns with the event driven concurrency model offered by actors Like you see in the example it s the same way to use join pattern with actors it just do it a list of case declaration in the method receive to show when the model is completed Practically the same tools are available in F to use join patternScala Join and Chymyst are newer implementations of the Join Pattern improving upon Dr Philipp Haller s Scala Joins Haskell edit Join Language is an implementation of the Join Pattern in Haskell Scheme edit The Join Patterns allows a new programming type especially for the multi core architectures available in many programming situations with a high levels of abstraction This is based on the Guards and Propagation So an example of this innovation has been implemented in Scheme 28 Guards is essential to guarantee that only data with a matching key is updated retrieved Propagation can cancel an item reads its contents and puts backs an item into a store Of course the item is also in the store during the reading The guards is expressed with shared variables And so the novelty is that the join pattern can contains now propagated and simplified parts So in Scheme the part before is propagated and the part after is removed The use of the Goal Based is to divise the work in many tasks and joins all results at the end with the join pattern A system named MiniJoin has implemented to use the intermediate result to solve the others tasks if it s possible If is not possible it waits the solution of others tasks to solve itself So the concurrent join pattern application executed in parallel on a multi core architecture doesn t guarantee that parallel execution lead to conflicts To Guarantee this and a high degree of parallelism a Software Transactional Memory STM within a highlytuned concurrent data structure based on atomic compare and swap CAS is use This allows to run many concurrents operations in parallel on multi core architecture Moreover an atomic execution is used to prevent the false conflict between CAS and STM 28 Other similar design patterns editJoin Pattern is not the only pattern to perform multitasks but it s the only one that allow communication between resources synchronization and join different processes Sequence pattern consists of waiting that a task have completed to switch to another the classic implementation 43 Split pattern parallel split perform several tasks in parallel at the same time e g Map reduce 44 See also editJoin Java Join Java is a programming language that extends the standard Java programming language Joins concurrency library Joins is an asynchronous concurrent computing API from Microsoft Research for the NET Framework Join calculus The join calculus was developed to provide a formal basis for the design of distributed programming languages References editCedric Fournet Luc Maranget 2006 08 15 The Join Calculus language Institut National de Recherche en Informatique et Automatique Retrieved 2012 10 09 JoinCalculus Cunningham amp Cunningham Inc October 25 2009 Retrieved 2012 10 09 Fournet Cedric Gonthier Georges Levy Jean Jacques Maranget Luc 1996 A calculus of mobile agents CONCUR 96 Concurrency Theory Lecture Notes in Computer Science Vol 1119 Le Chesnay Concurrency Theory pp 406 421 doi 10 1007 3 540 61604 7 67 ISBN 978 3 540 61604 7 Maludzinski Slawomir Dobrowolski Grzegorz 2007 Agent Environment and Knowledge in Distributed Join Calculus Multi Agent Systems and Applications V Lecture Notes in Computer Science Vol 4696 pp 298 300 doi 10 1007 978 3 540 75254 7 30 ISBN 978 3 540 75253 0 Russio Claudio 2006 The Joins Concurrency Library Practical Aspects of Declarative Languages Lecture Notes in Computer Science Vol 4354 Cambridge Practical Aspects of Declarative Languages pp 260 274 CiteSeerX 10 1 1 187 8792 doi 10 1007 978 3 540 69611 7 17 ISBN 978 3 540 69608 7 Maranget Luc Le Fessant Fabrice 25 September 2007 Compiling Join Patterns Le Chesnay France Haller Phillip Van Cutsem Tom 2008 Implementing Joins Using Extensible Pattern Matching Coordination Models and Languages Lecture Notes in Computer Science Vol 5052 Lausanne Coordination Models and Languages pp 135 152 CiteSeerX 10 1 1 210 1242 doi 10 1007 978 3 540 68265 3 9 ISBN 978 3 540 68264 6 Sulzmann Martin S L Lam Edmund Parallel Join Patterns with Guards and Propagation Denmark Fournet Cedric Gonthier Georges 2002 The Join Calculus A Language for Distributed Mobile Programming Applied Semantics Lecture Notes in Computer Science Vol 2395 Springer pp 268 332 CiteSeerX 10 1 1 4 4788 doi 10 1007 3 540 45699 6 6 ISBN 978 3 540 44044 4 Ma Qin Maranget Luc 5 April 2004 Compiling Pattern Matching in Join Patterns CONCUR 2004 Concurrency Theory Lecture Notes in Computer Science Vol 3170 INRIA pp 417 431 CiteSeerX 10 1 1 499 8443 doi 10 1007 978 3 540 28644 8 27 ISBN 978 3 540 22940 7 S2CID 9956643 Singh Satnam 6 January 2007 Higher Order Combinators for Join Patterns using STM MONSIEUR Geert 2010 Pattern based Coordination in Process based Service Compositions Leuven Belgium Katholiek Universiteit Leuven Russo Claudio V 23 October 2008 Join Patterns for Visual Basic ACM SIGPLAN Notices 43 10 53 72 doi 10 1145 1449955 1449770 Aaron Turon Russo Claudio V 27 October 2011 Scalable Join Patterns PDF New York Association for Computing Machinery ISBN 978 1 4503 0940 0 Guzev Vadim B April 2008 Parallel C The Usage of Chords and Higher Order Functions in the Design of Parallel Programming Languages Proceedings of the 2008 International Conference on Parallel and Distributed Processing Techniques and Applications PDPTA 2008 PDF CSREA Press ISBN 978 1601320841 Notes edit Taral Dragon October 25 2009 Join Calculus Russo Claudio V 23 October 2008 Join Patterns for Visual Basic ACM SIGPLAN Notices 43 10 10 doi 10 1145 1449955 1449770 Parallel C Russo Claudio V 27 October 2008 Join patterns for visual basic ACM SIGPLAN Notices 43 10 2 doi 10 1145 1449955 1449770 Fournet Cedric Gonthier Georges 2002 The Join Calculus A Language for Distributed Mobile Programming Applied Semantics Lecture Notes in Computer Science Vol 2395 Springer pp 268 332 CiteSeerX 10 1 1 4 4788 doi 10 1007 3 540 45699 6 6 ISBN 978 3 540 44044 4 a b c d e f Russo Claudio V 27 October 2008 Join patterns for visual basic ACM SIGPLAN Notices 43 10 53 72 doi 10 1145 1449955 1449770 Russo Claudio V 23 October 2008 Join Patterns for Visual Basic ACM SIGPLAN Notices 43 10 5 doi 10 1145 1449955 1449770 Russo Claudio V 23 October 2008 Join Patterns for Visual Basic ACM SIGPLAN Notices 43 10 18 doi 10 1145 1449955 1449770 a b c Maranget Luc Le Fessant Fabrice 25 September 2007 Compiling Join Patterns Le Chesnay France Fournet Cedric Gonthier Georges Levy Jean Jacques Maranget Luc 1996 A calculus of mobile agents CONCUR 96 Concurrency Theory Lecture Notes in Computer Science Vol 1119 Le Chesnay Concurrency Theory pp 406 421 doi 10 1007 3 540 61604 7 67 ISBN 978 3 540 61604 7 Fournet Cedric Le Fessant Fabrice Maranget Luc Schmitt A 2003 JoCaml A Language for Concurrent Distributed and Mobile Programming Advanced Functional Programming Lecture Notes in Computer Science Vol 2638 pp 129 158 doi 10 1007 978 3 540 44833 4 5 ISBN 978 3 540 40132 2 Conchon S Le Fessant F 1999 Jocaml Mobile agents for Objective Caml Proceedings First and Third International Symposium on Agent Systems Applications and Mobile Agents pp 22 29 doi 10 1109 ASAMA 1999 805390 ISBN 0 7695 0342 X S2CID 14355301 Odersky Martin September 2000 An overview of functional nets Summer School Caminha Portugal September 2000 2395 Odersky Martin 2000 Functional Nets Programming Languages and Systems Lecture Notes in Computer Science Vol 1782 pp 1 25 doi 10 1007 3 540 46425 5 1 ISBN 978 3 540 67262 3 Itzstein G S Kearney D 2001 Join Java An alternative concurrency semantics for Java Technical Report ACRC 01 001 University of South Australia Benton N Fournet C June 2002 Modern concurrency abstractions for C In Proceedings of the 16th European Conference on Object Oriented Programming ECOOP 2002 Number 2374 in LNCS Benton N Cardelli L 2004 Modern Concurrency Abstractions for C ACM Transactions on Programming Languages and Systems Vol 26 Singh Satnam 6 January 2007 Higher Order Combinators for Join Patterns using STM p 1 a b Aaron Turon Russo Claudio V 27 October 2011 Scalable Join Patterns PDF New York Association for Computing Machinery p 4 ISBN 978 1 4503 0940 0 Aaron Turon Russo Claudio V 27 October 2011 Scalable Join Patterns PDF New York Association for Computing Machinery p 1 ISBN 978 1 4503 0940 0 a b Aaron Turon Russo Claudio V 27 October 2011 Scalable Join Patterns PDF New York Association for Computing Machinery p 3 ISBN 978 1 4503 0940 0 Aaron Turon Russo Claudio V 27 October 2011 Scalable Join Patterns PDF New York Association for Computing Machinery p 2 ISBN 978 1 4503 0940 0 a b c Fournet Cedric Gonthier Georges Levy Jean Jacques Maranget Luc Remy Didier 1996 A calculus of mobile agents CONCUR 96 Concurrency Theory Lecture Notes in Computer Science Vol 1119 Le Chesnay Concurrency Theory pp 406 421 doi 10 1007 3 540 61604 7 67 ISBN 978 3 540 61604 7 Maludzinski Slawomir Dobrowolski Grzegorz 2007 Agent Environment and Knowledge in Distributed Join Calculus Multi Agent Systems and Applications V Lecture Notes in Computer Science Vol 4696 pp 298 300 doi 10 1007 978 3 540 75254 7 30 ISBN 978 3 540 75253 0 Ma Qin Maranget Luc 5 April 2004 Compiling Pattern Matching in Join Patterns CONCUR 2004 Concurrency Theory Lecture Notes in Computer Science Vol 3170 INRIA pp 417 431 CiteSeerX 10 1 1 499 8443 doi 10 1007 978 3 540 28644 8 27 ISBN 978 3 540 22940 7 S2CID 9956643 a b c Haller Phillip Van Cutsem Tom 2008 Implementing Joins Using Extensible Pattern Matching Coordination Models and Languages Lecture Notes in Computer Science Vol 5052 Lausanne Coordination Models and Languages pp 135 152 CiteSeerX 10 1 1 210 1242 doi 10 1007 978 3 540 68265 3 9 ISBN 978 3 540 68264 6 a b c Russo Claudio V 23 October 2008 Join Patterns for Visual Basic ACM SIGPLAN Notices 43 10 53 72 doi 10 1145 1449955 1449770 a b c Sulzmann Martin S L Lam Edmund Parallel Join Patterns with Guards and Propagation Denmark Hopf J von Itzstein G Stewart al 2002 Hardware Join Java A High Level Language For Reconfigurable Hardware Development Hong Kong IEEE Archived from the original on 2013 02 19 Plociniczak Hubert Eisenbach Susan 2010 JErlang Erlang with Joins Coordination Models and Languages Lecture Notes in Computer Science Vol 6116 Springer pp 61 75 Bibcode 2010LNCS 6116 61P doi 10 1007 978 3 642 13414 2 5 ISBN 978 3 642 13413 5 Liu Yigong 2007 2009 Join Asynchronous Message Coordination and Concurrency Library Introduction to Polyphonic C Parallel C Archived from the original on 2013 11 26 Hanus Michael January 2007 The Joins Concurrency Library Vol 4354 ISBN 978 3 540 69608 7 Comega Aaron Turon Russo Claudio V 27 October 2011 Scalable Join Patterns PDF New York Association for Computing Machinery ISBN 978 1 4503 0940 0 Fournet Cedric Le Fessant Fabrice Maranget Luc Schmitt Alan 2003 JoCaml a Language for Concurrent Distributed and Mobile Programming PDF Advanced Functional Programming Lecture Notes in Computer Science Springer Verlag pp 129 158 Hammond Michaelson Sun Programming reactive systems in Hume Concurrent Basic Archived from the original on 2015 04 25 Russio Claudio 2006 The Joins Concurrency Library Practical Aspects of Declarative Languages Lecture Notes in Computer Science Vol 4354 Cambridge Practical Aspects of Declarative Languages pp 260 274 CiteSeerX 10 1 1 187 8792 doi 10 1007 978 3 540 69611 7 17 ISBN 978 3 540 69608 7 The Joins Concurrency Library Haller Phillip Odersky Martin June 2007 Actors that unify threads and events Coordination Models and Languages Lecture Notes in Computer Science Vol 4467 Springer pp 171 190 doi 10 1007 978 3 540 72794 1 10 ISBN 978 3 540 72793 4 MONSIEUR Geert 2010 Pattern based Coordination in Process based Service Compositions Leuven Belgium Katholiek Universiteit Leuven p 68 MONSIEUR Geert 2010 Pattern based Coordination in Process based Service Compositions Leuven Belgium Katholiek Universiteit Leuven p 70External links editConcurrent Basic Scalable Joins The Joins Concurrency Library INRIA Join Calculus homepage Retrieved from https en wikipedia org w index php title Join pattern amp oldid 1179464018, wikipedia, wiki, book, books, library,

article

, read, download, free, free download, mp3, video, mp4, 3gp, jpg, jpeg, gif, png, picture, music, song, movie, book, game, games.