多執行緒中遞迴鎖的實現.
阿新 • • 發佈:2018-12-29
*引用本文請註明來自 blog.csdn.net/wtz1985
在上一篇文章中,我已經闡述了多執行緒中簡單鎖的實現,可在結束的時候,我就提了那麼一個問題,那就是如果在一個連結串列中進行插入時,要進行查詢的操作,如果只是簡單的鎖,是沒法實現的。所以“遞迴鎖”就浮現於世了。
可能有些人看到遞迴這兩個字,有點傻了眼,其實也沒什麼的,簡單的介紹,就是進行簡單的計數而已。剛開始引用鎖的時候,就產生它,當在鎖沒有解開的時候,還要繼續用鎖,就簡單的加一,解開一把就減一,當計數為零時,就把鎖銷燬掉。下面用程式來簡單的闡述一下,遞迴鎖是怎麼實現的:
1、遞迴鎖介面的定義。(鎖的介面的定義已經在上一篇定義過了,這裡不再重複)
- /*------ recursive_locker.h -------*/
- #ifndef _RECURSIVE_H
- #define _RECURSIVE_H
- #include "locker.h"
- Locker* recursive_locker_create(Locker* real_locker);
- #endif /*_RECURSIVE_H*/
2、遞迴鎖的實現。
- /*------ recursive_locker.c ------*/
- #include "recursive_locker.h"
- #include <stdlib.h>
- #include <stdio.h>
- #include <assert.h>
- #include <string.h>
- typedef struct _PrivInfo
- {
- Locker* real_locker;
- pthread_t current_pthread_locker;
- int locker_count;
- }PrivInfo;
- staticint recursive_locker_lock(Locker* thiz)
- {
- assert(thiz != NULL);
- PrivInfo* priv = thiz->priv;
- if(priv->current_pthread_locker == pthread_self())
- {
- priv->locker_count ++;
- }
- else
- {
- locker_lock(priv->real_locker);
- priv->lcoker_count = 1;
- priv->current_pthread_locker = pthread_self();
- }
- return 0;
- }
- staticint recursive_locker_unlock(Locker* thiz)
- {
- assert(thiz != NULL);
- PrivInfo* priv = thiz->priv;
- if(priv->current_>pthread_locker == pthread_self())
- {
- if(priv->locker_count == 1)
- {
- priv->locker_count = 0;
- priv->current_pthread_locker = 0;
- locker_unlock(priv->real_locker);
- }
- else
- {
- priv->locker_count --;
- }
- }
- else
- {
- assert(!"error");
- }
- return 0;
- }
- staticvoid recursive_locker_destroy(Locker* thiz)
- {
- assert(thiz != NULL);
- PrivInfo* priv = thiz->priv;
- locker_destroy(priv->real_locker);
- free(thiz);
- return ;
- }
- Locker* recursive_locker_create(Locker* real_locker)
- {
- Locker* thiz = (Locker* )malloc(sizeof(Locker) + sizeof(PrivInfo));
- PrivInfo* priv = thiz->priv;
- priv->real_locker = real_locker;
- priv->current_pthread_locker = 0;
- priv->locker_count = 0;
- thiz->lock = recursive_locker_lock;
- thiz->unlock = recursive_locker_unlock;
- thiz->locker_destroy = recursive_locker_destroy;
- return thiz;
- }
上面就是遞迴鎖的實現。如果對COM熟悉的話,這個遞迴鎖結構應該是比較簡單的,就是一個的計數器而已。有了這個遞迴鎖就不用愁在連結串列插入的時候,在進行查詢操作鎖會出現問題。