I want to print a nice loading message with these three fading dots, while the main thread does some heavy IO stuff. This is why I implemented this:
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <stdbool.h>
static bool loadingStop;
static pthread_mutex_t loadingMutex;
void *loadingDots(void *message);
int main() {
loadingStop = false;
// MUTEX
pthread_mutex_init(&loadingMutex, NULL);
// ATTRIBUTE
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
// THREAD
pthread_t loadingThread;
pthread_create(&loadingThread, &attr, loadingDots, (void *)"Loading (main, does something long)");
pthread_attr_destroy(&attr);
// SOMETHING TIME CONSUMING
usleep(8000000);
// PLEASE 'LoadingDots' TO STOP
pthread_mutex_lock(&loadingMutex);
loadingStop = true;
pthread_mutex_unlock(&loadingMutex);
// WAIT FOR IT TO FINISH
pthread_join(loadingThread, NULL);
pthread_mutex_destroy(&loadingMutex);
printf("This is printed after 'LoadingDots' savely quit.\n");
return 0;
}
void *loadingDots(void *message)
{
int c = 0;
while (1) {
switch (c) {
case 0:
printf("\r%s \r%s", (char *)message, (char*)message);
break;
default:
putchar('.');
break;
}
fflush(stdout);
usleep(1000000);
c = (c+1) % 4;
pthread_mutex_lock(&loadingMutex);
if (loadingStop) { break; };
pthread_mutex_unlock(&loadingMutex);
}
putchar('\n');
pthread_exit(NULL);
}