The following code runs a simple background process repeatedly until requested to stop by the main thread:
#include <iostream>
#include <thread>
#include <chrono>
void sleep(int duration) {
        std::this_thread::sleep_for(std::chrono::milliseconds{duration});
}
void background(volatile bool *flag) {
    while(*flag) {
        std::cout << '*' << std::flush;
        sleep(500);
    }
}
int main() {
    bool flag=true;
    auto func = [&flag](){ background(&flag); };
    std::thread t{func};
    std::cin.ignore();
    flag=false;
    t.join();
}
However, the program seems to work just as well if background is defined without the volatile, i.e. void background(bool *flag).
So: 1) is this a correct use of volatile? and 2) is the volatile actually needed here?
 
    