Pull from upstream before solving this task.
The goal of this assignment is to learn and understand the mechanisms of multithreading and concurrency programming. You will use the functionality of the POSIX standard for that and learn about how POSIX manages the creation, handling, and termination of threads.
We decided to show you the aspects of multithreading via a simple ASCII game. You can see if you have done something right by observing that the game is getting more playable. In the beginning, you will only see a plain game map without any content.
In the game, you are stranded in deep space in your malfunctioning spaceship. Therefore, you need to collect supply crates in order to repair it. However, there are aliens who also want to retrieve those precious crates and will damage your spaceship if you dare to encounter them. Furthermore, there are stationary black holes which you will want to avoid.
The game consists of 3 different entities:
Black holes: Black holes are a 2×2 square on the game map. They are stationary and will kill your player immediately upon contact. (represented by a ‘B’)
Aliens: Aliens are a single field on the game map and are moving at medium speed. They will destroy your spaceship upon contact. (represented by an ‘A’)
Player: To collect supply crates and avoid enemies, the player (represented by a ‘P’) gets moved via the WASD keys. The game shall quit when ‘q’ is pressed, when it hits an enemy or when it hits the border. (Lifepoints get set to 0)
Supply crates: To get points, you may collect some crates (represented by ‘#’). Once one crate is collected, the current crate should disappear on the map and the next artifact shall spawn immediately at a random position.
You’ll have to install
ncurses on your system. In
Debian/Ubuntu the following line will do the job:
sudo apt-get install libncurses6-dev libncursesw6-dev
ncursesw6 is not working or not available for your system, you may also use
ncursesw5. If that’s the case, you may replace the line
NCURSES = $(shell ncursesw6-config --cflags --libs)
Makefile with the line:
NCURSES = $(shell ncursesw5-config --cflags --libs)
Do NOT make any other changes to the
When you open the folder of this task, you will notice four files:
Makefile: Use this file to compile and run the program or clean up the folder with it.
spacecollector.h: This file contains relevant includes, typedefs, predefined values. You can change them as you wish but be careful: you MUST NOT commit changes to this file. Therefore all changes are irrelevant for us.
helpers.c: This file contains functions, which make your implementation run. As with your header file, you can change everything in there, but as the header file, you MUST NOT commit any changes to this file as well, so your changes are irrelevant to the testing system.
spacecollector.c: This is the only file that will be checked and used by the test system. Please follow the TODOs and ONLY change and add code between TODO BEGIN and TODO END!
You must not create ANY global variables, delete existing code outside of the TODOs (comments can be changed and added, of course), or rearrange existing code! Be careful, do not delete any needed functions declared in the header file.
Furthermore, you should keep the lifetime of variables in mind and you shouldn’t leak any memory that you allocate. You don’t need to test this with valgrind since libncurses leaks memory and therefore valgrind would produce wrong results.
What to do before you start?
Pull from upstream!
Carefully look at the TODOs in the
- The TODOs are enumerated in the suggested way you should solve the assignment
Look at the Manpage and what those parameters of the needed functions are for and how they are used. (
pthread_create( ... ),
pthread_cancel( ... ),
pthread_join( ... ), etc [https://man7.org/linux/man-pages/man7/pthreads.7.html])
Only begin if you understand the basic concept, what a thread is, and what it does. Bruteforcing will lead to a severe amount of wasted time.
Try to understand the different functions in the
spacecollector.cfile and their connections.
Hint: Make sure that you reuse as many variables as possible.
You find all the needed information on the manual pages. You can access them by either typing
man into the terminal or by reading them on various websites. For example, the manual for
pthread_create( ... ) may be accessed by the command
man pthread_create . For this exercise, you might find the following links helpful.
In this course, it’s very important to find errors yourself and notice issues in your own usage of syscalls or other functions. Therefore we recommend getting comfortable with a debugger, especially since most of you will take OS in the next semesters!
In case you prefer a german source:
- Linux-UNIX-Programmierung von Jürgen Wolf (chapter 10)
If you need a rough overview of the pthread library, make sure to check out the pthread tutorial by Peter C. Chapin. It contains a lot of information you might need for the first and second assignments.
spacecollector.c in your git repository. You can find this file in the directory
A1. Tag the submission with
A1 and push it to the server. Do not add any additional files to the folder!
If you have any questions regarding this assignment, go to discord and read through the SLP channels. The probability that your question was already answered or some discussions will lead you in the right direction is quite high. If not so, just ask in the corresponding channel.
Sebastian Felix, email@example.com