zoukankan      html  css  js  c++  java
  • 仿Java的AtomicMarkableReference的AtomicMarkablePointer(C++)

     1 //@author: Zou Xiaohang
     2 //@describe: this class is like AtomicMarkableReference which is in java concurrent package.
     3 //             remember the pointer is 32bits address
     4 template<class Pointer>
     5 class AtomicMarkablePointer{
     6 private:
     7     std::atomic<Pointer> ptr;
     8     const int32_t Marked = 0x00000001;
     9     const int32_t UnMraked = 0x00000000;
    10 public:
    11     explicit AtomicMarkablePointer(Pointer p, bool mark){
    12         ptr.store((Pointer)((int32_t)p | (int32_t)mark));
    13     }
    14     AtomicMarkablePointer(const AtomicMarkablePointer &a){
    15         ptr.store(a.ptr.load());
    16     }
    17     AtomicMarkablePointer operator = (const AtomicMarkablePointer &a){
    18         if (*this != a){
    19             ptr.store(a.ptr.load());
    20         }
    21         return *this;
    22     }
    23     Pointer getReference() const {
    24         Pointer p = ptr.load();
    25         return (bool)((int32_t)p & Marked) ? (Pointer)((int32_t)(p)& ~Marked) : p;
    26     }
    27     bool isMarked() const {
    28         Pointer p = ptr.load();
    29         return (bool)((int32_t)p & Marked);
    30     }
    31     Pointer get(bool &b) const {
    32         Pointer p = ptr.load();
    33         b = (bool)((int32_t)p & Marked);
    34         return b ? (Pointer)((int32_t)(p)& ~Marked) : p;
    35     }
    36     bool compareAndSet(Pointer expectedPointer, Pointer newPointer,
    37         bool expectedMark, bool newMark){
    38         Pointer p = ptr.load();
    39         bool b = (bool)((int32_t)p & Marked);
    40         if (b == expectedMark){
    41             expectedPointer = (Pointer)((int32_t)expectedPointer | (int32_t)b);
    42             return ptr.compare_exchange_strong(expectedPointer, (Pointer)((int32_t)newPointer | (int32_t)newMark));
    43         }
    44         return false;
    45     }
    46     void set(Pointer newPointer, bool newMark){
    47         newPointer = (Pointer)((int32_t)newPointer | (int32_t)newMark);
    48         ptr.exchange(newPointer);
    49     }
    50     bool attemptMark(Pointer expectedPointer, bool newMark){
    51         Pointer newPointer = (Pointer)((int32_t)expectedPointer | (int32_t)newMark);
    52         expectedPointer = isMarked() ? (Pointer)((int32_t)expectedPointer | Marked) : expectedPointer;
    53         return ptr.compare_exchange_strong(expectedPointer, newPointer);
    54     }
    55     /*void print()const{
    56         std::cout << getReference() << " ";
    57         std::cout << (isMarked() ? "Marked" : "UnMarked");
    58     }*/
    59 };
  • 相关阅读:
    Yii笔记之filter用法 j神
    [转载]C# 剪切板编程 Clipboard
    [转载]3521工程
    [原创]获取委托链方式,用于多播委托。
    [转载]C#为应用程序注册快捷键 Ctrl+C Ctrl+V
    【原创】序列化/反序列化
    【原创】WinForm操作EXCEL(第三方插件NPOI)
    【原创】MyXls导出Excel (适用于Winform/WebForm)
    【原创】特性与反射(一)
    【原创】特性与反射(二)
  • 原文地址:https://www.cnblogs.com/zxh1210603696/p/3721460.html
Copyright © 2011-2022 走看看