亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 7553 | 回復(fù): 0
打印 上一主題 下一主題

Linux內(nèi)核互斥鎖--mutex [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2010-02-03 13:49 |只看該作者 |倒序?yàn)g覽
一、定義:
/linux/include/linux/mutex.h
47struct mutex {
  48        /* 1: unlocked, 0: locked, negative: locked, possible waiters */
  49        atomic_t                count;
  50        spinlock_t              wait_lock;
  51        struct list_head        wait_list;
  52#ifdef CONFIG_DEBUG_MUTEXES
  53        struct thread_info      *owner;
  54        const char              *name;
  55        void                    *magic;
  56#endif
  57#ifdef CONFIG_DEBUG_LOCK_ALLOC
  58        struct lockdep_map      dep_map;
  59#endif
  60};

二、作用及訪問規(guī)則:
互斥鎖主要用于實(shí)現(xiàn)內(nèi)核中的互斥訪問功能。內(nèi)核互斥鎖是在原子 API 之上實(shí)現(xiàn)的,但這對(duì)于內(nèi)核用戶是不可見的。對(duì)它的訪問必須遵循一些規(guī)則:同一時(shí)間只能有一個(gè)任務(wù)持有互斥鎖,而且只有這個(gè)任務(wù)可以對(duì)互斥鎖進(jìn)行解鎖;コ怄i不能進(jìn)行遞歸鎖定或解鎖。一個(gè)互斥鎖對(duì)象必須通過其API初始化,而不能使用memset或復(fù)制初始化。一個(gè)任務(wù)在持有互斥鎖的時(shí)候是不能結(jié)束的。互斥鎖所使用的內(nèi)存區(qū)域是不能被釋放的。使用中的互斥鎖是不能被重新初始化的。并且互斥鎖不能用于中斷上下文。但是互斥鎖比當(dāng)前的內(nèi)核信號(hào)量選項(xiàng)更快,并且更加緊湊,因此如果它們滿足您的需求,那么它們將是您明智的選擇。
三、各字段詳解:
1、atomic_t count;
指示互斥鎖的狀態(tài):
1 沒有上鎖,可以獲得
0 被鎖定,不能獲得
負(fù)數(shù) 被鎖定,且可能在該鎖上有等待進(jìn)程
初始化為沒有上鎖。
2、spinlock_t wait_lock;
等待獲取互斥鎖中使用的自旋鎖。在獲取互斥鎖的過程中,操作會(huì)在自旋鎖的保護(hù)中進(jìn)行。初始化為為鎖定。
3、struct list_head wait_list;
等待互斥鎖的進(jìn)程隊(duì)列。
四、操作:
1、定義并初始化:
struct mutex mutex;
mutex_init(&mutex);
79# define mutex_init(mutex) \
80do { \
81 static struct lock_class_key __key; \
82 \
83 __mutex_init((mutex), #mutex, &__key); \
84} while (0)
42void
43__mutex_init(struct mutex *lock, const char *name, struct lock_class_key *key)
44{
45 atomic_set(&lock->count, 1);
46 spin_lock_init(&lock->wait_lock);
47 INIT_LIST_HEAD(&lock->wait_list);
48
49 debug_mutex_init(lock, name, key);
50}
直接定于互斥鎖mutex并初始化為未鎖定,己count為1,wait_lock為未上鎖,等待隊(duì)列wait_list為空。
2、獲取互斥鎖:
(1)具體參見linux/kernel/mutex.c
void inline fastcall __sched mutex_lock(struct mutex *lock);
獲取互斥鎖。實(shí)際上是先給count做自減操作,然后使用本身的自旋鎖進(jìn)入臨界區(qū)操作。首先取得count的值,在將count置為-1,判斷如果原來count的置為1,也即互斥鎖可以獲得,則直接獲取,跳出。否則進(jìn)入循環(huán)反復(fù)測(cè)試互斥鎖的狀態(tài)。在循環(huán)中,也是先取得互斥鎖原來的狀態(tài),在將其之為-1,判斷如果可以獲取(等于1),則退出循環(huán),否則設(shè)置當(dāng)前進(jìn)程的狀態(tài)為不可中斷狀態(tài),解鎖自身的自旋鎖,進(jìn)入睡眠狀態(tài),待被在調(diào)度喚醒時(shí),再獲得自身的自旋鎖,進(jìn)入新一次的查詢其自身狀態(tài)(該互斥鎖的狀態(tài))的循環(huán)。
(2)具體參見linux/kernel/mutex.c
int fastcall __sched mutex_lock_interruptible(struct mutex *lock);
和mutex_lock()一樣,也是獲取互斥鎖。在獲得了互斥鎖或進(jìn)入睡眠直到獲得互斥鎖之后會(huì)返回0。如果在等待獲取鎖的時(shí)候進(jìn)入睡眠狀態(tài)收到一個(gè)信號(hào)(被信號(hào)打斷睡眠),則返回_EINIR。
(3)具體參見linux/kernel/mutex.c
int fastcall __sched mutex_trylock(struct mutex *lock);
試圖獲取互斥鎖,如果成功獲取則返回1,否則返回0,不等待。
3、釋放互斥鎖:
具體參見linux/kernel/mutex.c
void fastcall mutex_unlock(struct mutex *lock);
釋放被當(dāng)前進(jìn)程獲取的互斥鎖。該函數(shù)不能用在中斷上下文中,而且不允許去釋放一個(gè)沒有上鎖的互斥鎖。
五、使用形式:
struct mutex mutex;
mutex_init(&mutex); /*定義*/
...
mutex_lock(&mutex); /*獲取互斥鎖*/
... /*臨界資源*/
mutex_unlock(&mutex); /*釋放互斥鎖*/

本文來自ChinaUnix博客,如果查看原文請(qǐng)點(diǎn):http://blog.chinaunix.net/u3/110644/showart_2170141.html
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP