The user instanciates a ThreadGroup parameterized to process a maximum number of threads at a time.
The user then adds to the ThreadGroup functions and their arguments.
This add method blocks until there is room to launch the function in a thread.
- void add(void f(void *), void * arg) is not user friendly, use some std::function and templates
- measure the performance
- fix Makefile so main.cpp is rebuilt when ThreadGroup changes
- maybe a non-blocking add: enqueue
- use a condition variable instead of iterating through all threads for clean up