UNIX(多线程):28---双buffer “无锁” 设计
在linux多線(xiàn)程環(huán)境下對(duì)同一變量進(jìn)行讀寫(xiě)時(shí),經(jīng)常會(huì)遇到讀寫(xiě)的原子性問(wèn)題,即會(huì)出現(xiàn)競(jìng)爭(zhēng)條件。為了解決多個(gè)線(xiàn)程對(duì)同一變量訪(fǎng)問(wèn)時(shí)的競(jìng)爭(zhēng)條件問(wèn)題,操作系統(tǒng)層面提供了鎖、信號(hào)量、條件變量等幾種線(xiàn)程同步機(jī)制。如果對(duì)變量的每次訪(fǎng)問(wèn)都使用上述機(jī)制,由于系統(tǒng)調(diào)用會(huì)陷入內(nèi)核空間,需要頻繁的進(jìn)行上下文切換,這就導(dǎo)致了程序的時(shí)間開(kāi)銷(xiāo)比較大。
自然的,我們就想到,在多線(xiàn)程環(huán)境中,在某些情況下是否能減少甚至避免使用系統(tǒng)調(diào)用?答案是肯定的。
如果對(duì)多線(xiàn)程下的變量訪(fǎng)問(wèn)進(jìn)行分析,可以看到,線(xiàn)程對(duì)變量的訪(fǎng)問(wèn)可以分為以下幾類(lèi):
一個(gè)線(xiàn)程寫(xiě),另一個(gè)線(xiàn)程讀,簡(jiǎn)稱(chēng)一寫(xiě)一讀
多個(gè)線(xiàn)程寫(xiě),一個(gè)線(xiàn)程讀,簡(jiǎn)稱(chēng)多寫(xiě)一讀
一個(gè)線(xiàn)程寫(xiě),多個(gè)線(xiàn)程讀,簡(jiǎn)稱(chēng)一寫(xiě)多讀。
多個(gè)線(xiàn)程寫(xiě),多個(gè)線(xiàn)程讀,簡(jiǎn)稱(chēng)多寫(xiě)多讀。
在linux 系統(tǒng)中,多個(gè)線(xiàn)程同時(shí)讀一個(gè)變量是不需要同步的,而多個(gè)線(xiàn)程同時(shí)寫(xiě)一個(gè)變量或一個(gè)線(xiàn)程寫(xiě)而其他線(xiàn)程讀某個(gè)變量,是需要同步的,可以總結(jié)為:”多讀不互斥,而讀寫(xiě)和多寫(xiě)互斥“。
由于多個(gè)線(xiàn)程對(duì)同一變量的讀不需要同步,因而一寫(xiě)多讀和一寫(xiě)一讀并無(wú)本質(zhì)區(qū)別,進(jìn)而可以把多線(xiàn)程下對(duì)變量訪(fǎng)問(wèn)依據(jù)是否需要同步而合并成如下三類(lèi):
一寫(xiě)多讀
多寫(xiě)一讀
多寫(xiě)多讀
解決上面所有的互斥,都可以使用系統(tǒng)調(diào)用。上面已經(jīng)提到,在某些情況下我們是可以避免使用代價(jià)高昂的系統(tǒng)調(diào)用的。而“一寫(xiě)多讀”就是這些特殊情況中的一種。
<總結(jié)
以上是生活随笔為你收集整理的UNIX(多线程):28---双buffer “无锁” 设计的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 二叉树最长路径
- 下一篇: leetcode49. 字母异位词分组