2012-03-11 90 views
0

您好我想維護創建的信號量列表和它們允許的數量(允許訪問該信號量的線程實例的數量)值。我與地圖試圖STL像給信號量一個ID

map<sem_t, int> sem_map; 

,使得鑰匙(sem_t)具有計數作爲映射值。

但C++不允許我使用sem_t作爲鍵(sem_t)的聯合類型。那麼,我如何維護一個信號量列表?我的目標是每當我想鎖定或解鎖信號燈時,首先從維護的列表中獲取信號量的ID並對其進行一些預處理。

+0

難道你不能存儲像地圖 sem_map的東西其中threadID是你的關鍵和你的聯盟類型是值?否則,你需要聲明和deifne一個類來保存你的信號量,最大線程數量,當前線程數量,線程ID和可選的字符串標識符 – EdChum 2012-03-11 23:56:40

+0

嗨,我想是的,只是想保持簡單。 – 2012-03-12 00:00:53

回答

2

您可以使用sem_t的地址作爲重點:

map<sem_t*, int> sem_map; 

然後,給定一個sem_t X,你可以使用地圖訪問int值:

sem_map.find(&x); 

請注意,此解決方案只有在你沒有複製信號量時纔有效。

編輯:你不能在你的地圖中使用sem_t作爲鍵的原因是std :: map要求鍵類型定義了運算符<(爲了做內部排序,std :: map(s)是樹結構)。但是,聯合沒有定義運算符<,所以編譯器不會讓您使用它。另一方面,指針可以在它們之間進行比較,所以編譯器實際上會讓你在std :: map中使用它們作爲關鍵字。

+0

謝謝你做了我的工作。 – 2012-03-11 23:59:35

+0

順便說一句,你可以解釋爲什麼c + +不允許sem_t,但允許sem_t *呢? – 2012-03-12 00:01:24

+0

完成,編輯我的答案。 – mfontanini 2012-03-12 00:04:06