簡體   English   中英

將結構傳遞給內置的gcc以進行原子訪問

[英]pass a structure to gcc built-ins for atomic accesses

我有兩個結構,如下所示:

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


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

現在我想將例如pointer_t<Node<T> > newNext__sync_bool_compare_and_swap()函數。 根據函數的原型,我通過:

__sync_bool_compare_and_swap((unsigned long*) &newTail.ptr->next, oldNext, newNext)

問題是,如果我不將newNextunsigned long我將得到:

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) )

如果我將其強制轉換為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.

有人可以向我解釋一下,您可以對這兩種結構使用__sync_bool_compare_and_swap嗎?

謝謝

#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))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM