多執行緒操作雜湊表避免死鎖

2021-08-03 01:37:06 字數 2088 閱讀 2018

copy自《unix環境高階程式設計》圖11.11。

#include 

#include

#define nhash 29

#define hash(id) (((unsigned long)id)%nhash)

struct foo *fh[nhash];

pthread_mutex_t hashlock = pthread_mutex_initializer;

struct foo ;

struct foo *

foo_alloc(int id) /* allocate the object */

idx = hash(id);

pthread_mutex_lock(&hashlock);

fp->f_next = fh[idx];

fh[idx] = fp;

pthread_mutex_lock(&fp->f_lock);

pthread_mutex_unlock(&hashlock);

/* ... continue initialization ... */

pthread_mutex_unlock(&fp->f_lock);

}return(fp);

}void

foo_hold(struct foo *fp) /* add a reference to the object */

struct foo *

foo_find(int id) /* find an existing object */

}pthread_mutex_unlock(&hashlock);

return(fp);

}void

foo_rele(struct foo *fp) /* release a reference to the object */

/* remove from list */

idx = hash(fp->f_id);

tfp = fh[idx];

if (tfp == fp) else

pthread_mutex_unlock(&hashlock);

pthread_mutex_unlock(&fp->f_lock);

pthread_mutex_destroy(&fp->f_lock);

free(fp);

} else

}

程式基本流程:

fh    雜湊表(鍊錶解決雜湊衝突)

foo 雜湊表節點(指向物件)

foo_alloc 申請節點

1、申請節點記憶體

2、插入到雜湊表

2.1、雜湊表加鎖(hashlock)

2.2、插入新節點

2.3、節點加鎖(此時節點已經新增到雜湊表中了)

2.4、雜湊表解鎖

2.5、其他初始化動作

2.6、節點解鎖

foo_hold 拿住節點

1、節點加鎖(所有節點都應該是通過foo_alloc獲取的,所以使用的時候已經在雜湊表中了)

2、節點引用計數加1

2、節點解鎖

foo_find 查詢節點

1、雜湊表加鎖(避免此時有申請或者釋放節點)

2、查詢節點

3、雜湊表解鎖

foo_rele 釋放節點

1、節點加鎖

2、判斷節點引用計數是否為1

2.1、節點引用計數為1,做以下動作

a. 節點解鎖,雜湊表加鎖

b. 節點加鎖

判斷此時節點引用計數是否為1,不為1則將引用計數減1

然後解鎖節點、解鎖雜湊表,函式返回

c. 從雜湊表中移除節點

d. 雜湊表解鎖

e. 節點解鎖

f. 釋放節點記憶體(需要釋放鎖)

2.2、節點引用計數不為1

節點引用計數減1

節點解鎖

參考:

什麼是多執行緒,鎖,死鎖,怎麼避免死鎖

面試官問執行緒的問題,以前從來沒有總結過怎麼回答,一下子就說不出來了。回來細細總結一下,下次不能再不知道從 說起了 細思之,首先應該 了解什麼是執行緒 執行緒是資源分配的基本單位,程式執行流的最小單位。執行緒可以共用記憶體資源,多執行緒能解決cpu空閒的問題。多執行緒能夠實現併發的執行任務,提高處理...

多執行緒死鎖的產生以及如何避免死鎖

產生死鎖必須同時滿足以下四個條件,只要其中任一條件不成立,死鎖就不會發生。互斥條件 程序要求對所分配的資源 如印表機 進行排他性控制,即在一段時間內某資源僅為乙個程序所占有。此時若有其他程序請求該資源,則請求程序只能等待。不剝奪條件 程序所獲得的資源在未使用完畢之前,不能被其他程序強行奪走,即只能 ...

多執行緒死鎖的產生以及如何避免死鎖

多執行緒以及多程序改善了系統資源的利用率並提高了系統 的處理能力。然而,併發執行也帶來了新的問題 死鎖。所謂死鎖是指多個執行緒因競爭資源而造成的一種僵局 互相等待 若無外力作用,這些程序都將無法向前推進。1 系統資源的競爭 2 程序推進順序非法 3 死鎖產生的必要條件 加鎖順序 執行緒按照一定的順序...