There is still a hidden problem. Let's do some more experimentation: let's write a third version of this program (let's call it ch14/pthreads3.c). In it, we say, what if the worker threads take longer to perform their work (than they are currently taking)? We can easily simulate this with a simple sleep(3) function, which is going to be introduced into the worker routine:
[...]void * worker(void *data){ long datum = (long)data; printf("Worker thread #%ld running ...\n", datum); sleep(3); printf("#%ld: work done, exiting now\n", datum); pthread_exit(NULL);}[...]
Let's try it out:
$ ./pthreads3 Worker thread #0 running ...Worker thread #1 running ...Worker thread #2 running ...[... All three threads sleep for 3s ...] ...