C++ 将结构传递给gcc内置程序以进行原子访问

C++ 将结构传递给gcc内置程序以进行原子访问,c++,multithreading,atomic,C++,Multithreading,Atomic,我有两个结构,如下所示: template <class T> struct pointer_t { T *ptr; uintptr_t tag; }; template <class T> struct Node { T data; pointer_t<Node<T> > next; }; 如果我将其转换为unsigned long,则: if ( __sync_bool_compare_and_swap((

我有两个结构,如下所示:

template <class T>
struct pointer_t
{
    T *ptr;
    uintptr_t tag;
};


template <class T>
struct Node
{
    T data;
    pointer_t<Node<T> > next;
};
如果我将其转换为unsigned long,则:

if ( __sync_bool_compare_and_swap((unsigned long*) &newTail.ptr->next, (unsigned long) oldNext, (unsigned long) newNext) )
我会得到:

error: ‘struct pointer_t<Node<int> >’ used where a ‘long unsigned int’ was expected
      if ( __sync_bool_compare_and_swap((unsigned long*) &newTail.ptr->next, newNext, newNext) )
error: ‘struct pointer_t<Node<int> >’ used where a ‘long unsigned int’ was expected.
错误:在需要“长无符号整数”的地方使用了“结构指针”。
有人能给我解释一下我能用这两种结构来比较和交换吗


谢谢

如果您觉得指针标记有趣,可以查看下面的链接


当函数需要
long unsigned int
时,为什么要强制转换为
unsigned long
?我的错误是,但我在强制转换时还是遇到了相同的错误:类型的强制转换无效…您的结构对于64b平台上的强制转换来说太宽了。您想做什么?你想用标记指针吗?是的,我想用标记指针。我发现了我的问题。问题是,我应该只发送一个指针和一个指向函数的指针,这样才能工作!谢谢非常有帮助,但我有两个问题。首先,在我对
pointer\t
节点的定义中,我没有使用指向
pointer\t
的指针,我错了吗?因为我认为,如果我不使用指针,那么我就不必为每个节点获取两次内存,相反,使用单个新节点,我也会为指针获取内存,但以这种态度,当我想进行原子操作时,我面临着问题。我的第二个问题是我没有理解你的最后一点,对不起,你能再解释一下吗?这对我来说似乎很有趣!
#include <iostream>
#include <bitset>
using namespace std;

template <class T>
struct pointer_t
{
    T *ptr;
    uintptr_t tag;
};


template <class T>
struct Node
{
    T data;
    pointer_t<Node<T> >* next;
};

int main()
{
    Node<int> *newTail = new Node<int>();
    pointer_t<Node<int> > *oldNext = newTail->next;


    Node<int> *newNext = new Node<int>();

    pointer_t<Node<int> >* newNextPtr = new pointer_t<Node<int> >();
    newNextPtr->ptr=newNext;

    if ( __sync_bool_compare_and_swap(&newTail->next, oldNext, newNextPtr)) {
        std::cout<<"Gotcha!\n";
      }
 }
#define get_markedness(p) (((ptr_int) (p)) & 3)
#define get_unmarked_reference(p) ((void *) (((ptr_int) (p)) & (~3)))
#define get_marked_reference(p,m) ((void *) (((ptr_int) (p)) | m))