您好我想維護創建的信號量列表和它們允許的數量(允許訪問該信號量的線程實例的數量)值。我與地圖試圖STL像給信號量一個ID
map<sem_t, int> sem_map;
,使得鑰匙(sem_t)具有計數作爲映射值。
但C++不允許我使用sem_t作爲鍵(sem_t)的聯合類型。那麼,我如何維護一個信號量列表?我的目標是每當我想鎖定或解鎖信號燈時,首先從維護的列表中獲取信號量的ID並對其進行一些預處理。
您好我想維護創建的信號量列表和它們允許的數量(允許訪問該信號量的線程實例的數量)值。我與地圖試圖STL像給信號量一個ID
map<sem_t, int> sem_map;
,使得鑰匙(sem_t)具有計數作爲映射值。
但C++不允許我使用sem_t作爲鍵(sem_t)的聯合類型。那麼,我如何維護一個信號量列表?我的目標是每當我想鎖定或解鎖信號燈時,首先從維護的列表中獲取信號量的ID並對其進行一些預處理。
您可以使用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中使用它們作爲關鍵字。
謝謝你做了我的工作。 – 2012-03-11 23:59:35
順便說一句,你可以解釋爲什麼c + +不允許sem_t,但允許sem_t *呢? – 2012-03-12 00:01:24
完成,編輯我的答案。 – mfontanini 2012-03-12 00:04:06
難道你不能存儲像地圖 sem_map的東西其中threadID是你的關鍵和你的聯盟類型是值?否則,你需要聲明和deifne一個類來保存你的信號量,最大線程數量,當前線程數量,線程ID和可選的字符串標識符 –
EdChum
2012-03-11 23:56:40
嗨,我想是的,只是想保持簡單。 – 2012-03-12 00:00:53