不可睡眠鎖 自旋鎖spinlock編碼學習

2021-07-25 23:26:18 字數 2223 閱讀 5695

開源力量學習筆記

自旋鎖(spinlock)簡介

自旋鎖是核心的一種同步機制,在同一時刻只能被最多乙個核心任務持有,所以乙個時刻只有乙個執行緒允許存在於臨界區中。

核心可以通過自旋鎖占有某些資源,直到使用完後再釋放鎖。如果該資源已經被其他的任務占有了,那核心會不斷等待,直到獲得該資源。

這點可以應用在多處理機器、或執行在單處理器上的搶占式核心中需要的鎖定服務。

自旋鎖(spinlock)的基本形式api

初始化:

在編譯時定義:define

_spinlock();

在執行時初始化:spin_lock_init();

持有鎖和釋放鎖:

spin_lock();

//臨界區

spin_unlock();

自旋鎖**程式設計示例:

#include

#include

<

linux

/kthread.h

>

#include

<

linux

/delay.h

>

module_license

("gpl");

module_author

("chen");

module_description

("the module is only used for test.");

//static define_spinlock(threads_lock)

;static spinlock_t threads_lock

;static void threads_lock_init

(void

)struct our_data

;static struct our_data my_data

;static void show_my_data

(void

)#define max_kthread 10

static struct task_struct

*threads

[max_kthread];

static

intthread_do

(void

*data

)return 0;}

static

intcreate_threads

(void

)return 0;}

static void cleanup_threads

(void

)static __init

intminit

(void

)static __exit void mfini

(void

)module_init

(minit);

module_exit

(mfini);

執行結果:

chen@ubuntu:~

/mygit

/module

/exam1$ dmesg

[3475

.623885

]call minit.[

3475

.625348

]run ..

.[3475

.625363

]run ..

.[3475

.625375

]run ..

.[3475

.625386

]run ..

.[3475

.625397

]run ..

.[3475

.625546

]run ..

.[3475

.625562

]run ..

.[3475

.625574

]run ..

.[3475

.625594

]run ..

.[3475

.627184

]run ..

.[3480

.215762

]call mfini.[

3480

.353601

]count1 2899

,count2 28990

0 給主人留下些什麼吧!~~

java鎖 自旋鎖

什麼是自旋鎖?所謂自旋鎖是指不會引起呼叫者睡眠,若鎖資源被其他執行緒占有,則會迴圈檢查鎖資源的佔有者是否已經釋放鎖。總結下來自旋鎖就是原子操作 自迴圈 如何實現自旋鎖?自旋鎖的原理是通過cas實現,其中cas是比較並交換,本身是使用它的原子性的compareandset方法。cas 操作中包含三個運...

自旋鎖以及可重入自旋鎖

首先是簡單的自旋鎖 實現 package org.cc.concur public class mylock private boolean islocked false public synchronized void lock throws interruptedexception islock...

樂觀鎖 悲觀鎖 自旋鎖

三 樂觀鎖和悲觀鎖的使用場景 四 自旋鎖 總是假設最壞的情況,每次去拿資料的時候都認為別人會修改,所以每次在拿資料的時候都會上鎖,這樣別人想拿這個資料就會阻塞直到它拿到鎖 共享資源每次只給乙個執行緒使用,其它執行緒阻塞,用完後再把資源轉讓給其它執行緒 傳統的關係型資料庫裡邊就用到了很多這種鎖機制,比...