2011-12-24 55 views
8

當我試圖使一個地圖,其具有字符串作爲密鑰和pthread_mutex_t作爲元件,錯誤而使用互斥

map<string, pthread_mutex_t> connectedClientsMutexes; 

    pthread_mutex_t myMutex;//= PTHREAD_MUTEX_INITIALIZER; 
    connectedClientsMutexes.insert(pair<string,pthread_mutex_t>(userName,myMutex)); 
while (1) 
    { 

    pthread_mutex_lock(&connectedClientsMutexes[userName]); 
    // do something here 
    } 

這產生:

階段3:pthread_mutex_lock.c:312:__pthread_mutex_lock_full:斷言 `( - (e))!= 3 || !強勁'失敗。

+0

該代碼有時工作,有時沒有:S – 2011-12-24 23:45:32

回答

8

複製互斥鎖是未定義的。嘗試在地圖上放置一個指向互斥體的指針。

編輯這就是未定義行爲的本質。有時候你很幸運(或似乎),有時候你不會。

代替映射中多個互斥體的副本,您將多個互斥體指向互斥體。因此,像:

map<string, pthread_mutex_t *> connectedClientsMutexes; 

connectedClientsMutexes.insert(pair<string,pthread_mutex_t *>(userName, &myMutex)); 

pthread_mutex_lock(connectedClientsMutexes[userName]); 

想必你身邊路過地圖上各個線程所以明智的做法是不分配堆棧上的互斥除非你是積極的,他們是不會出門的範圍。將它們聲明爲全局變量或動態分配它們並用pthread_mutex_init()進行初始化。

+0

但我想添加多個互斥體,奇怪的代碼有時運行良好,有時不運行:( – 2011-12-25 00:33:48