    // The contents of this file are in the public domain. See LICENSE_FOR_EXAMPLE_PROGRAMS.txt
    /*
        This is a very simple example that illustrates the use of the
        thread_function object from the dlib C++ Library.

        The output of the programs should look like this:

            45.6
            9.999
            I have no args!
            val: 3
    */

    #include <iostream>
    #include <dlib/threads.h>
    #include <dlib/ref.h>

    using namespace dlib;
    using namespace std;

    void thread_1(double a)
    {
        cout << a << endl;
    }

    void thread_2 ()
    {
        cout << "I have no args!" << endl;
    }

    void thread_increment(double& a)
    {
        a += 1;
    }

    int main()
    {
        // create a thread that will call thread_1(45.6)
        thread_function t1(thread_1,45.6);
        // wait for the t1 thread to end
        t1.wait();

        // create a thread that will call thread_1(9.999)
        thread_function t2(thread_1,9.999);
        // wait for the t2 thread to end
        t2.wait();

        // create a thread that will call thread_2()
        thread_function t3(thread_2);

        // Note that we can also use the ref() function to pass a variable
        // to a thread by reference.  For example, the thread below adds
        // one to val.
        double val = 2;
        thread_function t4(thread_increment, dlib::ref(val));
        t4.wait(); // wait for t4 to finish before printing val.
        // Print val.  It will now have a value of 3.
        cout << "val: " << val << endl;

        // At this point we will automatically wait for t3 to end because
        // the destructor for thread_function objects always wait for their
        // thread to terminate.
    }