Here are some exercises for you to practice concurrent programming and prepare for the assignments by applying some of the material from the lectures. Some of the exercises give you a direct head start for certain assignments. None of the exercises are mandatory.
The solutions to all of the exercises are available online from the start of the course. Do make an effort to solve them yourself before looking at the solutions, however. Solving the exercises yourself will help you learn the concepts covered in the course, which will obviously help you quite a bit when the exam rolls around.
Exercise 2: Using semaphores for conditional synchronisation
Exercise 3: Sieves and Bridges