c++ - C 中 lockFree 列表的标记指针

标签 c++ pointers bitmask lock-free

我正在尝试使用标记指针来处理列表上的无锁操作,以便在此事务期间如果其他线程在列表上操作时阻止比较和交换 (CAS) 通过。我的节点结构和 CAS 如下所示:

struct node {
    unsigned long key;
    unsigned long val;
    struct node * next;
};

static inline bool CAS(std::atomic<node*> node, struct node* oldNode, struct node* newNode)
{
    node.compare_exchange_strong(oldNode, newNode, std::memory_order_seq_cst);
}

我找到了一些设置和检查这些指针的方法,但我不清楚它们是如何工作的,这些是设置掩码和验证它的方法。

__inline struct node* setTagMask(struct node* p, int MASK_BIT)
{
    return (struct node*) ((uintptr_t)p | MASK_BIT);
}

__inline bool isMaskFlagSet(struct node* p)
{
    return ((uintptr_t)p & MASK_BIT) != 0;
}

所以我不清楚的是,例如在 setTagMask 中,如果我在我的列表中使用它,它会删除所有对其值和下一个元素的引用。

任何人都可以向我解释如何正确设置这些位以使列表的其他元素保持不变吗?

最佳答案

setTagMask 函数返回指针 p 的修改版本。如果您将这个修改后的指针存储在您的链表中,那么链表就会被破坏,因为修改后的指针不再指向一个节点

指针修改如下。指针 p 被转换为无符号整数,可以存储指针:uintptr_t . 然后根据MASK_BIT 设置一位或多位。最后,将结果转换回指针并返回。

函数 isMaskFlagSet 检查掩码位是否仍然设置。

我能想到的唯一用例是:在使用指针之前,每次都必须调用 isMaskFlagSet。如果设置了掩码位,则禁止实际使用指针。

关于c++ - C 中 lockFree 列表的标记指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35534481/

相关文章:

c++ - 指针牌组替换函数C++

创建一个设置了 N 个最低有效位的掩码

ios - Sprite Kit 中允许的 categoryBitMask 的最大数量是多少?

c++ - Perl 系统调用导致核心转储但 $?保持为零

C++ HTML模板框架、模板化库、HTML生成器库

c++ - C++获取构造函数的类型

c++ - 为什么这是按值调用,尽管我传递的是指针?

c++ - 全局访问单例数据

在结构上创建双指针以按索引使用(类似于数组,但最大大小未知)

MySql 查询掩码表