2014-09-24 91 views
0

我需要在pthread互斥體上編寫一個C++包裝器,並且在執行運算符==時遇到問題。有沒有辦法爲我可以用於測試的pthread_mutex獲取某種類型的唯一ID?如何測試兩個pthread互斥體的相等性?

編輯:

更具體什麼我想acheive我有以下幾點:

pthread_mutex_t mutex1; 
pthread_mutex_t mutex2; 
pthread_mutex_t mutex3; 

pthread_mutex_init(&mutex1, NULL); 
pthread_mutex_init(&mutex2, NULL); 
mutex3 = mutex2; 

我想有一個bool mutexCompare(pthread_mutex_t t1, pthread_mutex_t t2)函數將返回false爲mutexCompare(mutex1, mutex2)對於mutexCompare(mutex2, mutex3)

已經有int pthread_equal(ptrhead_t t1, pthread_t t2)這是我所需要的線程。我需要一個類似的互斥體。

編輯:

mutex3 = mutex2;

上述分配高度氣餒。 POSIX文件指出

"There are no defined comparison or assignment operators for the types pthread_attr_t, pthread_cond_t, pthread_condattr_t, pthread_mutex_t, pthread_mutexattr_t, pthread_rwlock_t and pthread_rwlockattr_t."

的pthread_mutex_t的對象(和其他人從名單)應該進行比較,並通過他們的地址分配。

+1

總是最好發佈一些代碼來確定你正在使用的問題 – krisdyson 2014-09-24 07:32:53

+1

你期望什麼語義?在我看來,'operator =='應該可以比較'pthread_mutex_t'成員的內存地址,但是你可能會想要檢查它們是否處於相同的鎖定/解鎖狀態。您是否期望這些包裝器支持複製,以及如果是這樣,使用互斥量的所有權語義,這是相關的。例如,您可能希望任何副本最初都有新的互斥鎖重置,這反映了您將複製鎖定對象然後成爲新對象的唯一訪問者的想法,而無需仲裁訪問權限。 – 2014-09-24 08:14:04

+0

目前尚不清楚你的意思。兩個互斥體是相等的意味着什麼?同一種類型和相同的狀態? – 2014-09-24 08:17:22

回答

0

您可以直接檢查pthread_mutex_t,因爲具有兩個相同互斥鎖的唯一方法是明確複製一個互斥鎖。沒有完全可靠的方法來比較C中的兩種不透明類型,但在C++中,您應該只能在pthread_mutex_t上使用==

或者,您可以只使用一個靜態的int nextId,並且每次從頭開始創建互斥包裝時都會獲取唯一ID;複製包裝時複製ID。當然,這隻有在它是調用pthread_mutex_init的包裝本身時才起作用,或者如果用戶承諾永遠不會從一個互斥體構造兩個包裝。

+0

我試着==兩個不透明的結構之間,我得到「錯誤:無效的操作數到二進制表達式('pthread_mutex_t'(又名'_opaque_pthread_mutex_t ')和'pthread_mutex_t') if(mutex2 == mutex3){「 – mihair 2014-09-24 07:40:12

+0

有趣 - 他們必須使用一些技巧來強制類型完全不透明。然後使用ID的東西。 – Sneftel 2014-09-24 07:42:26

+0

我會去生成的ID。謝謝! – mihair 2014-09-24 07:46:44