Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Examples

Boost , The Boost C++ Libraries BoostBook Documentation Subset , Chapter 20. Boost.Lockfree

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

Queue

Класс<boost::lockfree::queue>реализует многописательную/многочитательную очередь. Следующий пример показывает, как целые значения производятся и потребляются 4 потоками каждый:

#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;
}

Результатом программы является:

produced 40000000 objects.
consumed 40000000 objects.

Stack

В классе<boost::lockfree::stack>реализован стек с несколькими авторами/многочитателями. Следующий пример показывает, как целые значения производятся и потребляются 4 потоками каждый:

#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;
}

Результатом программы является:

produced 4000000 objects.
consumed 4000000 objects.

Waitfree Single-Producer/Single-Consumer Queue

Класс<boost::lockfree::spsc_queue>реализует безостановочную очередь для одного производителя / одного потребителя. Следующий пример показывает, как целые значения производятся и потребляются 2 отдельными потоками:

#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;
}

Результатом программы является:

produced 10000000 objects.
consumed 10000000 objects.

PrevUpHomeNext

Статья Examples раздела The Boost C++ Libraries BoostBook Documentation Subset Chapter 20. Boost.Lockfree может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Chapter 20. Boost.Lockfree ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 17:21:52/0.0067100524902344/0