Concurrent Programming: Languages and Techniques


The main goal of this unit is to teach the students the development techniques that are needed for the development of concurrent programs in a realistic, general purpose setting, using advanced mainstream languages such as Erlang, Go and Rust.

By the end of this unit, students will have acquired knowledge, skills and competences that will enable them to:

  • Understand the challenges of concurrent programming and the concepts and fundamental techniques required for the development of correct applications;
  • Be able to develop standard solutions to address common challenges in this area, arguing for or showing their correctness;
  • Know how to instantiate the main design patterns for concurrent programming using state-of-the-art programming languages and handle the critical aspects of a concurrent application.

General characterization





Responsible teacher

Bernardo Parente Coutinho Fernandes Toninho, Carla Maria Gonçalves Ferreira


Weekly - 4

Total - 84

Teaching language



Available soon


Programming languages:

- Alan A. A. Donovan, Brian W. Kernighan. The Go Programming Language

- Steve Klabnik, Carol Nichols. The Rust Programming Language

- Joe Armstrong. Programming Erlang: Software for a Concurrent World

Foundations of concurrent programming:

- Robin Milner. Communicating and Mobile Systems: The Pi-Calculus

- Dave Clarke, Johan Ostlund, Ilya Sergey, and Tobias Wrigstad. Ownership Types: A Survey

- Ralf Jung, Jacques-Henri Jourdan, Robbert Krebbers, and Derek Dreyer. RustBelt: Securing the Foundations of the Rust Programming Language

- Gul Agha. Actors: a model of concurrent computation in distributed systems

Complementary references:

- William Kennedy with Brian Ketelsen and Erik St. Martin. Go in Action

- Fred Hebert. Learn you some Erlang for great good!

Teaching method

Each week there is a two-hour lecture and a two-hour laboratory class.

Lectures include theoretical exposition, illustrated by case studies, and supported by the use of development tools. In laboratory sessions, students solve exercises: modelling and implementing systems; analysis of implementation strategies and their trade-offs.

Assessment includes three tests (possibly oral), three mini-projects and three practical assignments (group). In the practical assignments, the students will have to implement a concurrent system (these assessments differ on the complexity of the system being model) and write a report.

Conditions for approval: NE >= 9.5 and NT >= 9.5, where NE is the mean of tests grades and NT is the practical assignment grade.

Evaluation method

Evaluation of the concepts presented

3 individual written tests. Each provides 10% of the final grade, rounded to decimal values. There is no minimum grade. Part of each test will focus on the project of each course module.

Project evaluation

3 projects, developed in groups of 2 (exceptionaly 3, with explicit permition from the lectures), each worth 20% of the final grade, each grade rounded to decimal values.

Assigments evaluation

3 mini-projects, developed in groups of 2 (exceptionaly 3, with explicit permition from the lectures), each worth 5% of the final grade, each grade rounded to unit values. To the final grade count the best 2, being the grade of this component rounded to decimal values.

The course does not require frequência.

Subject matter

1. Concurrent programming using ownership and permissions

1.1 Models and concepts
1.2 The Rust programming language
1.3 Concurrent programming in Rust: channels and message passing; shared memory, arcs and mutexes; asynchronous event-driven programming
1.4 Tools and techniques to support message passing concurrent programming in Rust

2. Concurrent Programming using message passing
2.1 Models and concepts
2.2 The Go programming language
2.3 Concurrent programming in Go: synchronous channels; green threads (goroutines) and select; asynchrony; concurrent programming patterns
2.4 Tools and techniques to support message passing concurrent programming in Go

3. Concurrent programming using Actors
3.1 Models and concepts
3.2 The Erlang language
3.3 Concurrent programming in Erlang: processes; message passing; process design patterns (OTP); robustness (error handling, time-outs)
3.3 Tools and techniques to support concurrent programming in Erlang


Programs where the course is taught: