Multiple threads will be “busy waiting” for the next_action variable to be set. Ideally one thread would call perform_action whenever the main sets it to a nonzero.
// choose a time-consuming activity based on action ...
void perform_action(int action);
int next_action = 0;
void* threadfunc(void*)
{
    while (1)
    {
        while (next_action == 0);
        int my_action = next_action;
        next_action = 0;
        perform_action(my_action);
    }
}   
int main()
{
    // assume we've spawned threads executing threadfunc ...
    while (1)
    {
        // determine what action should be dispatched to a thread next
        next_action = read_action_from_user();
        // exit the program
        if (next_action == -1) { break; }
    }
}
 
     
    