體驗mutex
10g新加了mutex,替換部分latch的功能。
經過了解,原來mutex不是oracle自己發明的,而是作業系統的一個功能。既然不是oracle獨家的,那我也想體驗一下,於是就有了下面小程式。
struct foo *fh[NHASH]是一個典型的hash table,上面有幾個表頭,每個表頭下面掛著一個foo連結串列,每個連結串列最後一個節點的next又指回表頭。
操作的過程就是 hold(f_count++) -> 操作 ->釋放(f_count--或free)
main函式里,對f2節點故意只hold,不釋放,最後列印的時候可以看到f_count是2
經過了解,原來mutex不是oracle自己發明的,而是作業系統的一個功能。既然不是oracle獨家的,那我也想體驗一下,於是就有了下面小程式。
struct foo *fh[NHASH]是一個典型的hash table,上面有幾個表頭,每個表頭下面掛著一個foo連結串列,每個連結串列最後一個節點的next又指回表頭。
操作的過程就是 hold(f_count++) -> 操作 ->釋放(f_count--或free)
main函式里,對f2節點故意只hold,不釋放,最後列印的時候可以看到f_count是2
點選(此處)摺疊或開啟
-
#include <stdio.h>
-
#include <stdlib.h>
-
#include <pthread.h>
-
#include <unistd.h>
-
#include <string.h>
-
-
#define NHASH 29
-
#define HASH(fp) (((unsigned long)fp)%NHASH)
-
-
struct foo *fh[NHASH];
-
-
pthread_mutex_t hashlock = PTHREAD_MUTEX_INITIALIZER;
-
-
struct foo
-
{
-
int f_count;
-
pthread_mutex_t f_lock;
-
struct foo* f_next;
-
int f_id;
-
int f_value;
-
};
-
-
struct foo* foo_alloc(int id, int value)
-
{
-
struct foo* fp = NULL;
-
struct foo* tmp = NULL;
-
int idx;
-
if((fp = malloc(sizeof(struct foo))) != NULL)
-
{
-
fp->f_count = 1;
-
if(pthread_mutex_init(&fp->f_lock, NULL) != 0)
-
{
-
free(fp);
-
return NULL;
-
}
-
}
-
-
idx = HASH(fp);
-
pthread_mutex_lock(&hashlock);
-
-
if(fh[idx] == NULL)
-
{
-
fh[idx] = fp;
-
}
-
else
-
{
-
tmp = fh[idx];
-
while(tmp->f_next != NULL)
-
{
-
tmp = tmp->f_next;
-
}
-
tmp->f_next = fp;
-
}
-
fp->f_next = fh[idx];
-
pthread_mutex_lock(&fp->f_lock);
-
pthread_mutex_unlock(&hashlock);
-
fp->f_value = value;
-
fp->f_id = id;
-
pthread_mutex_unlock(&fp->f_lock);
-
return fp;
-
}
-
-
void foo_hold(struct foo* fp)
-
{
-
pthread_mutex_lock(&fp->f_lock);
-
fp->f_count++;
-
pthread_mutex_unlock(&fp->f_lock);
-
}
-
-
struct foo* foo_find(int id)
-
{
-
struct foo *fp;
-
int idx;
-
idx = HASH(fp);
-
pthread_mutex_lock(&hashlock);
-
for(fp=fh[idx]; fp!=NULL; fp=fp->f_next)
-
{
-
if(fp->f_id == id)
-
{
-
foo_hold(fp);
-
break;
-
}
-
}
-
pthread_mutex_unlock(&hashlock);
-
return(fp);
-
}
-
-
void foo_rele(struct foo* fp)
-
{
-
struct foo* tfp;
-
int idx;
-
-
pthread_mutex_lock(&fp->f_lock);
-
if(fp->f_count <= 1)
-
{
-
pthread_mutex_lock(&hashlock);
-
idx = HASH(fp);
-
tfp = fh[idx];
-
if (tfp == fp)
-
{
-
if(fp->f_next != fh[idx]) fh[idx] = fp->f_next;
-
else fh[idx] = NULL;
-
}
-
else
-
{
-
while(tfp->f_next != fp)
-
{
-
tfp = tfp->f_next;
-
}
-
tfp->f_next = fp->f_next;
-
}
-
pthread_mutex_unlock(&hashlock);
-
pthread_mutex_unlock(&fp->f_lock);
-
pthread_mutex_destroy(&fp->f_lock);
-
free(fp);
-
}
-
else
-
{
-
fp->f_count--;
-
pthread_mutex_unlock(&fp->f_lock);
-
}
-
}
-
-
void main()
-
{
-
struct foo* f1 = foo_alloc(1, 100);
-
struct foo* f2 = foo_alloc(2, 200);
-
-
foo_hold(f1);
-
f1->f_value = 111;
-
foo_rele(f1);
-
-
foo_hold(f2);
-
f2->f_value = 222;
-
-
foo_rele(f1);
-
-
int i;
-
for(i=1; i<NHASH; i++)
-
{
-
if(fh[i] != NULL)
-
{
-
printf(\"fh[%d]: id=%d, value=%d, count=%d\\n\", i, fh[i]->f_id, fh[i]->f_value, fh[i]->f_count);
-
}
-
}
-
-
return;
- }
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26239116/viewspace-1124827/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- C#互斥體——MutexC#Mutex
- oracle mutexOracleMutex
- C# 中的 Mutex(互斥體)基礎用法C#Mutex
- Oracle:cursor:mutex XOracleMutex
- Oracle Mutex 等待事件OracleMutex事件
- mutex compare latchMutex
- 'cursor:mutex ..'/ 'cursor:pin ..'/ 'library cache:mutex ..'型別的等待事件Mutex型別事件
- _gcry_ath_mutex_lock: Assertion `*lock == ((ath_mutex_t) 0)' failed.GCMutexAI
- 當 Go struct 遇上 MutexGoStructMutex
- cursor: mutex S等待事件Mutex事件
- 【轉】spin lock 和mutexMutex
- Go 系列教程 —— 25. MutexGoMutex
- spinlock和mutex選用方法Mutex
- 誰在死鎖Mutex——用Windbg查詢Mutex死鎖所有者執行緒Mutex執行緒
- Go語言的互斥鎖MutexGoMutex
- 深入理解Oracle中的MutexOracleMutex
- oracle mutex概念掃盲之一OracleMutex
- pthread_mutex 鎖問題threadMutex
- 微服務新體驗之Aspire初體驗微服務
- OpenResty體驗REST
- 體驗WebAssemblyWeb
- 體驗webhooksWebHook
- 原始碼剖析 golang 中 sync.Mutex原始碼GolangMutex
- 互斥鎖mutex的簡單實現Mutex
- Go 併發程式設計之 MutexGo程式設計Mutex
- golang開發:CSP-WaitGroup MutexGolangAIMutex
- Go死鎖——當Channel遇上Mutex時GoMutex
- golang 中 sync.Mutex 的實現GolangMutex
- Go併發程式設計--Mutex/RWMutexGo程式設計Mutex
- Oracle Library cache mutex x tipsOracleMutex
- Semaphore vs. Mutex 簡單區別Mutex
- 如何查MUTEX的的持有者Mutex
- Oracle Mutex實現機制(轉帖)OracleMutex
- Go 互斥鎖 Mutex 原始碼分析(二)GoMutex原始碼
- Angular 初體驗Angular
- http初體驗HTTP
- MQTT之初體驗MQQT
- AQS初體驗AQS