2015-06-07 19 views
0

我有兩種結構,就像下面:傳遞的結構與gcc內置插件用於原子訪問

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長則:

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這兩個結構?

感謝

+0

你爲什麼鑄造'無符號long'當函數想要'長無符號整型'? –

+0

我的錯誤,但我仍然得到了同樣的錯誤鑄造: 無效的類型鑄造... – Moriss

+0

您的結構將太寬,投下64b平臺上。 – Jeff

回答

1
#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)) 
+0

謝謝!非常有幫助,但我有兩個問題。 首先,在我爲節點定義'pointer_t'時,我沒有使用指向'pointer_t'的指針,我錯了嗎?因爲我認爲如果我不使用指針,那麼我不必爲每個節點獲取兩次內存,而是單獨使用新的內存,我也會記住指針,但是當我想要進行原子操作時採用這種態度我面對問題。 我的第二個問題是我沒有得到最後一點,對不起,但你能解釋一下嗎?這對我來說似乎很有趣! – Moriss