多執行緒情況下 很多變數 頻繁訪問 難道每個都要加鎖訪問嗎?

時間 2021-05-07 03:27:26

1樓:黃超

call

omp_set_lock

(bvar(0

))do

ilock=1

,nlock

!write(*,*) locklist(ilock)call

omp_set_lock

(bvar

(locklist

(ilock

)))end do

call

omp_unset_lock

(bvar(0

))這算什麼,為了防止鎖死,我在加鎖前又加了個全域性鎖(實際上這裡用omp critical應該也可以)

2樓:owen

單純計數只需要用atomic 這種cpu 原子指令就好……類似dict 資料結構可以拆分資料,抽象分段鎖……

如果邊界條件很快,那麼可以用cas

一句話,看場景……

3樓:Test

如果要保證可見性不需要,這種情況一般是乙個執行緒修改其他執行緒讀取,另外如果你只是需要某個時刻的快照寫可以不加鎖,其他情況需要加鎖,當然包括樂觀鎖和悲觀鎖

4樓:Atela

給個思路: 每個共享變數在程序/執行緒裡自己維護乙份來進行處理。

這裡可以參考nginx:

你要限制最大連線數, nignx為每個程序設定了最大連線數,超過了就不accept了。 同時你可以使用accept鎖的方式,讓連線在幾個程序之間做負載均衡,每個accept的連線只在相同的程序上處理。

能用CAS的則用CAS,沒把握的就加鎖

5樓:立強

12345都是全域性變數性質,即使加鎖,也不能保證退出臨界區後被其他執行緒修改,所以只要原子讀寫就夠了。

至於session,對應的是登入狀態,不是連線狀態,所以應該以單獨的service的形式存在,或者在資料庫/nosql裡表示,用記憶體物件mgr物件的方式顯然不合理

6樓:羊牮

怎麼我感覺是設計問題,很多共享變數要訪問。這種設計就是成問題了。

應該設計一條線,專門處理Session管理。其它執行緒訪問通過訊息或者actor來交流,啟用非同步等待可以簡化流程。當然我不懂Go。不知道它有那些實現不了。

7樓:朱涵俊

就你這個場景來說可以不用os鎖。用cmpxchg指令,這是彙編指令,一般的語言都沒提供這個語義。1,3,4沒必要加鎖,用原子操作即可(彙編指令加lock),2用cmpxchg

8樓:

atomic庫。

func AddInt32(addr *int32, delta int32) (new int32)

func AddInt64(addr *int64, delta int64) (new int64)

func AddUint32(addr *uint32, delta uint32) (new uint32)

func AddUint64(addr *uint64, delta uint64) (new uint64)

func AddUintptr(addr *uintptr, delta uintptr) (new uintptr)

func LoadInt32(addr *int32) (val int32)

func LoadInt64(addr *int64) (val int64)

func LoadPointer(addr *unsafe.Pointer) (val unsafe.Pointer)

func LoadUint32(addr *uint32) (val uint32)

func LoadUint64(addr *uint64) (val uint64)

func LoadUintptr(addr *uintptr) (val uintptr)

func StoreInt32(addr *int32, val int32)

func StoreInt64(addr *int64, val int64)

func StorePointer(addr *unsafe.Pointer, val unsafe.Pointer)

func StoreUint32(addr *uint32, val uint32)

func StoreUint64(addr *uint64, val uint64)

func StoreUintptr(addr *uintptr, val uintptr)

func SwapInt32(addr *int32, new int32) (old int32)

func SwapInt64(addr *int64, new int64) (old int64)

func SwapUint32(addr *uint32, new uint32) (old uint32)

func SwapUint64(addr *uint64, new uint64) (old uint64)

func SwapUintptr(addr *uintptr, new uintptr) (old uintptr)

9樓:neo tian

多執行緒下變數是否加鎖,關鍵是要看場景,也就是 @chunquedong 所說的多執行緒共享,在乙個程序裡所有執行緒可共享同乙個資源。運用到場景中比如說限時搶購,對於產品數量的計算必然加鎖。當然,golang的『狗程』亦是如此。

10樓:張興宸

首先,你要明白一點所有的無鎖結構都會帶來一些效能上或者操作上負擔。鎖存在的意義是為了保證一致性,你所謂問題不是鎖的問題,你把你的操作封裝成乙個struct,在sturct內部進行鎖的操作,外部呼叫是無感知的,就可以了。

11樓:鄒曉航0號

鎖多不關鍵,關鍵是執行緒同時競爭比較耗 Locks Aren't Slow; Lock Contention Is

量子力學波函式什麼情況下可以分離變數?

我記得,當初講拉格朗日量和動能勢能關係的時候,書上是有完整證明過程的,你可以隨便找本物理系的理論力學,裡面證明十分詳細,或者翻開數學物理方法,翻翻分離變數那幾章,最好是結合著看。 月下的淡然 這實際上是薛丁格繪景的乙個假設。只要系統的哈密頓量不含時,就能分離成這種形式。量子系統的動力學,即系統隨時間...

同事頻繁找我借錢,怎麼在不影響關係的情況下杜絕這種現象?

我被同乙個人借過五次錢,前三次都是幾百塊錢,對方會快就還了。第四次,他借4000,我直接說 手上沒有那麼多 第五次,他借3000,我還是選擇了直接拒絕。我其實不關心他遇到了什麼難處,何況對於我來說,去把借出的錢要回來,實在太麻煩,所以在我沒把握把錢要回來的情況下,就選擇了直接不借。他工作是我的兩倍,...

頻繁出入金的情況下,怎麼衡量自己的交易操作水平?

蝦說理財 成熟的交易者應追求的是穩定的增長,不論是否頻繁出入金,在淨值沒有很大的虧損率的前提下,衡量交易水平才有意義。如果你的交易押注策略固定一致,可以統計每段時間內的期望收益率來衡量交易情況,所謂期望收益率即期望收益除以初始淨值,而每段時間內的期望收益可以分段以每次盈虧的額度乘以每次的概率的 求和...