帮酷LOGO
0 0 评论
  • 显示原文与译文双语对照的内容
文章标签:lock  FREE  消费者  无锁定  Producer  队列  LOC  SIN  
A fast single-producer, single-consumer lock-free queue for C++

  • 源代码名称:readerwriterqueue
  • 源代码网址:http://www.github.com/cameron314/readerwriterqueue
  • readerwriterqueue源代码文档
  • readerwriterqueue源代码下载
  • Git URL:
    git://www.github.com/cameron314/readerwriterqueue.git
  • Git Clone代码到本地:
    git clone http://www.github.com/cameron314/readerwriterqueue
  • Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/cameron314/readerwriterqueue
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
  • 单个生产者,C+ +的单个消费者锁空闲队列

    这个迷你仓库拥有我自己的用于 C++的锁空闲队列( 我是从零开始设计的)的实现。

    它只支持两个线程用例( 一个消费一个生产)。 线程不能 switch 角色,尽管你希望( 但这可能会破坏) 能够完全使用这个队列,但是你可以完全使用它。

    注:如果你需要一个通用的多用户,多消费者锁免费队列,我有其中之一太多。

    特性

    • 快速
    • 与C++11兼容( 支持移动对象而不复制副本)
    • 完全一般的( 任何类型的模板容器) --就像 std::queue 一样,你不需要为元素分配内存( 这节省了编写锁定内存管理器的麻烦)。
    • 在相邻的块中分配内存
    • 提供 try_enqueue 方法,保证从不分配内存( 队列以初始容量开始)
    • 还提供了一个 enqueue 方法,可以根据需要动态地增大队列的大小
    • 同时提供 try_emplace/emplace 便利方法
    • 带有 wait_dequeue的阻塞版本
    • 完全"等待自由"( 无compare-and-swap循环)。 排队和队列总是 O(1) ( 不计算内存分配)
    • 在x86上,内存屏障编译为无操作,即排队和队列是一个简单的负载和存储序列( 和分支)。

    使用

    简单地将 readerwriterqueue.h 和 atomicops.h 文件放到源代码中并包括它们:- ) 一个现代编译器需要(。MSVC2010+,GCC 4.7 +,ICC 13 + 或者任何符合C++11的编译器都应该工作)。

    注意:如果你正在使用 GCC,你确实需要 GCC 4.7或者更高版本的-- 4.6,这可以防止原子栅栏原语正常工作。

    例如:

    usingnamespacemoodycamel;ReaderWriterQueue<int> q(100); // Reserve space for at least 100 elements up frontq.enqueue(17); // Will allocate memory if the queue is fullbool succeeded = q.try_enqueue(18); // Will only succeed if the queue has an empty slot (never allocates)assert(succeeded);int number;
    succeeded = q.try_dequeue(number); // Returns false if the queue was emptyassert(succeeded && number == 17);// You can also peek at the front item of the queue (consumer only)int* front = q.peek();assert(*front == 18);
    succeeded = q.try_dequeue(number);assert(succeeded && number == 18);
    front = q.peek(); assert(front == nullptr); // Returns nullptr if the queue was empty

    阻塞版本具有完全相同的API,添加了 wait_dequeuewait_dequeue_timed 方法:

    BlockingReaderWriterQueue<int> q;
    std::thread reader([&]() {
     int item;
     for (int i = 0; i!= 100; ++i) {
     // Fully-blocking: q.wait_dequeue(item);
     // Blocking with timeoutif (q.wait_dequeue_timed(item, std::chrono::milliseconds(5)))
     ++i;
     }
    });
    std::thread writer([&]() {
     for (int i = 0; i!= 100; ++i) {
     q.enqueue(i);
     std::this_thread::sleep_for(std::chrono::milliseconds(10));
     }
    });
    writer.join();
    reader.join();assert(q.size_approx() == 0);

    如果队列是空的,请注意 wait_dequeue 将无限期阻塞;如果你确定最后一个元素将出现,或者队列有一个 static 生存期,那么这意味着必须只调用 wait_dequeue。 因为在线程等待线程时销毁队列将调用未定义的行为。

    免责声明

    队列应该只在对齐整数和指针访问为原子的平台上使用;幸运的是,这包括所有的现代处理器( 比如。 x86/x86-64,ARM和 PowerPC )。对于与 DEC Alpha处理器( 具有非常弱的内存排序) 一起使用的用户来说,不适用。)

    如果有人访问其他处理器,我想在任何非x86-based上运行测试,请注意它仅在 x86(-64); 上被测试过。

    最后,我不是专家。 虽然这是我在设计和测试数据结构方面的工作,但我第一次尝试锁定自由编程,尽管我对代码有信心,但这是可能的。

    特别是,锁自由编程是专利地区,这里代码可以能非常违反挂起的专利( 我还没有)。 值得注意的是,我从零开始提出了这个算法和实现,独立于任何现有的空闲队列。

    更多信息

    请参阅 LICENSE.md 文件以获得许可证( 简化的BSD )。

    我的博客介绍了导致这里代码的上下文,如果你对锁免费编程感兴趣,可能会引起兴趣。



    文章标签:fast  LOC  FREE  CONS  SIN  lock  队列  消费者  

    Copyright © 2011 HelpLib All rights reserved.    知识分享协议 京ICP备05059198号-3  |  如果智培  |  酷兔英语