| Home | Libraries | People | FAQ | More

## Examples

### Queue

The `boost::lockfree::queue` class implements a multi-writer/multi-reader queue. The following example shows how integer values are produced and consumed by 4 threads each:

    #include <boost/thread/thread.hpp>
    #include <boost/lockfree/queue.hpp>
    #include <iostream>

    #include <boost/atomic.hpp>

    boost::atomic_int producer_count(0);
    boost::atomic_int consumer_count(0);

    boost::lockfree::queue<int> queue(128);

    const int iterations = 10000000;
    const int producer_thread_count = 4;
    const int consumer_thread_count = 4;

    void producer(void)
    {
        for (int i = 0; i != iterations; ++i) {
            int value = ++producer_count;
            while (!queue.push(value))
                ;
        }
    }

    boost::atomic<bool> done (false);
    void consumer(void)
    {
        int value;
        while (!done) {
            while (queue.pop(value))
                ++consumer_count;
        }

        while (queue.pop(value))
            ++consumer_count;
    }

    int main(int argc, char* argv[])
    {
        using namespace std;
        cout << "boost::lockfree::queue is ";
        if (!queue.is_lock_free())
            cout << "not ";
        cout << "lockfree" << endl;

        boost::thread_group producer_threads, consumer_threads;

        for (int i = 0; i != producer_thread_count; ++i)
            producer_threads.create_thread(producer);

        for (int i = 0; i != consumer_thread_count; ++i)
            consumer_threads.create_thread(consumer);

        producer_threads.join_all();
        done = true;

        consumer_threads.join_all();

        cout << "produced " << producer_count << " objects." << endl;
        cout << "consumed " << consumer_count << " objects." << endl;
    }

The program output is:

    produced 40000000 objects.
    consumed 40000000 objects.

### Stack

The `boost::lockfree::stack` class implements a multi-writer/multi-reader stack. The following example shows how integer values are produced and consumed by 4 threads each:

    #include <boost/thread/thread.hpp>
    #include <boost/lockfree/stack.hpp>
    #include <iostream>

    #include <boost/atomic.hpp>

    boost::atomic_int producer_count(0);
    boost::atomic_int consumer_count(0);

    boost::lockfree::stack<int> stack(128);

    const int iterations = 1000000;
    const int producer_thread_count = 4;
    const int consumer_thread_count = 4;

    void producer(void)
    {
        for (int i = 0; i != iterations; ++i) {
            int value = ++producer_count;
            while (!stack.push(value))
                ;
        }
    }

    boost::atomic<bool> done (false);

    void consumer(void)
    {
        int value;
        while (!done) {
            while (stack.pop(value))
                ++consumer_count;
        }

        while (stack.pop(value))
            ++consumer_count;
    }

    int main(int argc, char* argv[])
    {
        using namespace std;
        cout << "boost::lockfree::stack is ";
        if (!stack.is_lock_free())
            cout << "not ";
        cout << "lockfree" << endl;

        boost::thread_group producer_threads, consumer_threads;

        for (int i = 0; i != producer_thread_count; ++i)
            producer_threads.create_thread(producer);

        for (int i = 0; i != consumer_thread_count; ++i)
            consumer_threads.create_thread(consumer);

        producer_threads.join_all();
        done = true;

        consumer_threads.join_all();

        cout << "produced " << producer_count << " objects." << endl;
        cout << "consumed " << consumer_count << " objects." << endl;
    }

The program output is:

    produced 4000000 objects.
    consumed 4000000 objects.

### Waitfree Single-Producer/Single-Consumer Queue

The `boost::lockfree::spsc_queue` class implements a wait-free single-producer/single-consumer queue. The following example shows how integer values are produced and consumed by 2 separate threads:

    #include <boost/thread/thread.hpp>
    #include <boost/lockfree/spsc_queue.hpp>
    #include <iostream>

    #include <boost/atomic.hpp>

    int producer_count = 0;
    boost::atomic_int consumer_count (0);

    boost::lockfree::spsc_queue<int, boost::lockfree::capacity<1024> > spsc_queue;

    const int iterations = 10000000;

    void producer(void)
    {
        for (int i = 0; i != iterations; ++i) {
            int value = ++producer_count;
            while (!spsc_queue.push(value))
                ;
        }
    }

    boost::atomic<bool> done (false);

    void consumer(void)
    {
        int value;
        while (!done) {
            while (spsc_queue.pop(value))
                ++consumer_count;
        }

        while (spsc_queue.pop(value))
            ++consumer_count;
    }

    int main(int argc, char* argv[])
    {
        using namespace std;
        cout << "boost::lockfree::queue is ";
        if (!spsc_queue.is_lock_free())
            cout << "not ";
        cout << "lockfree" << endl;

        boost::thread producer_thread(producer);
        boost::thread consumer_thread(consumer);

        producer_thread.join();
        done = true;
        consumer_thread.join();

        cout << "produced " << producer_count << " objects." << endl;
        cout << "consumed " << consumer_count << " objects." << endl;
    }

The program output is:

    produced 10000000 objects.
    consumed 10000000 objects.