File: stack.cpp

package info (click to toggle)
boost1.90 1.90.0-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 593,120 kB
  • sloc: cpp: 4,190,908; xml: 196,648; python: 34,618; ansic: 23,145; asm: 5,468; sh: 3,774; makefile: 1,161; perl: 1,020; sql: 728; ruby: 676; yacc: 478; java: 77; lisp: 24; csh: 6
file content (70 lines) | stat: -rw-r--r-- 1,679 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
//  Copyright (C) 2009 Tim Blechmann
//
//  Distributed under the Boost Software License, Version 1.0. (See
//  accompanying file LICENSE_1_0.txt or copy at
//  http://www.boost.org/LICENSE_1_0.txt)

//[stack_example
#include <boost/lockfree/stack.hpp>
#include <boost/thread/thread.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;
}
//]