Assignment

In this assignment your task is to create a very simple thread pool. In files queue.h, worker.h, queue.c and worker.c is prepared implementation of task executor. It contains queue implementation as well. The goal is to have worker, that executes given jobs concurrently using pthread library.

Deadline is 13th April 2021 24:00 CEST (22:00 UTC)

Late submission will be penalised by 1.5 points for every day after deadline

What will you submit

You will submit code that will be thread-safe in worker.c, queue.c,worker.h and queue.h, you will also submit tests you used to prove your code in test_queue.c and test_worker.c.

You are not expected to use some unit testing framework or do some assertions, the tests are expected to put your code to different situations when some issues with the queue or worker might happen, and the program is expected to have a clear output from helgrind.

As last part of assignment you will write an pdf report, where you'll discuss which techniques of mutual exclusion you have used and why. The report will also contain list of problems you discovered in process of development using hellgrind, with short description of them and solution you have chosen.

Detailed description

Queue

The queue implemented in queue.c is not prepared to be used in multiple threads. Your first task is to add appropriate mutual exclusion technique to the queue implementation, so it can be safely used in multithreaded application.

As part part of implementation you should create a report that defines at least three different corner cases that might manifest problematic or buggy behaviour in the queue implementation and discuss the method how you avoided possible problems, for each such scenario you should create test in test_queue.c that will proove your code.

You should also put in the report all found errors you've encoutered during the implementation.

Worker

The worker is implemented in worker.c but currently it runs pushed jobs in master thread when function worker_execute is executed. The goal is to start several threads in worker_init, number of threads is one of attributes of function. The threads will then take out jobs from queue and execute them asynchronously.

As for queue you should discuss possible corner-cases and bottlenecks that might happen in your worker, since the worker is much more complex than the queue, you are expected to find, discuss and test at least four of them. Your tests should be put in test_worker.c file.

Report

The last part of assignment will be report of your work. You are expected to discuss the possible points of error and corner-cases regarding the states and actions on both queue and worker and how you have tested it. Also you are expected to write how you solved assignment and what thread-related problems you've found during development and how you've solved them.

Notes