1. 程式人生 > >gcc原子操作與spinlock簡單對比

gcc原子操作與spinlock簡單對比

GCC 提供的原子操作

gcc從4.1.2提供了__sync_*系列的built-in函式,用於提供加減和邏輯運算的原子操作。

type __sync_fetch_and_add (type *ptr, type value, ...)
type __sync_fetch_and_sub (type 
*ptr, type value, ...)
type __sync_fetch_and_or (type 
*ptr, type value, ...)
type __sync_fetch_and_and (type 
*ptr, type value, ...)
type __sync_fetch_and_xor (type 

*ptr, type value, ...)
type __sync_fetch_and_nand (type 
*ptr, type value, ...)


type __sync_add_and_fetch (type 
*ptr, type value, ...)
type __sync_sub_and_fetch (type 
*ptr, type value, ...)
type __sync_or_and_fetch (type 
*ptr, type value, ...)
type __sync_and_and_fetch (type 
*ptr, type value, ...)
type __sync_xor_and_fetch (type 
*ptr, type value, ...)
type __sync_nand_and_fetch (type 
*ptr, type value, ...)

先看看測試程式碼

// cas.c
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>

static int count = 0;


void *test_func(void *arg)
{
        int i=0;
        for(i=0;i<100000;++i){
                __sync_fetch_and_add(&count,1);
        }
        return NULL;
}

int main(int argc, const char *argv[])
{
        pthread_t id[100];
        int i = 0;

        for(i=0;i<100;++i){
                pthread_create(&id[i],NULL,test_func,NULL);
        }

        for(i=0;i<100;++i){
                pthread_join(id[i],NULL);
        }

        printf("%d\n",count);
        return 0;
}


// spinlock.c
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>

static int count = 0;
static pthread_spinlock_t spinlock;

void *test_func(void *arg)
{
        int i=0;
        for(i=0;i<100000;++i){
                pthread_spin_lock (&spinlock);
                count++;
                pthread_spin_unlock(&spinlock);
        }
        return NULL;
}

int main(int argc, const char *argv[])
{
        pthread_t id[100];
        int i = 0;
        pthread_spin_init (&spinlock, 0);

        for(i=0;i<100;++i){
                pthread_create(&id[i],NULL,test_func,NULL);
        }

        for(i=0;i<100;++i){
                pthread_join(id[i],NULL);
        }

        printf("%d\n",count);
        return 0;
}


// mutex.c 
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>

static int count = 0;
static pthread_mutex_t mutex;

void *test_func(void *arg)
{
        int i=0;
        for(i=0;i<100000;++i){
                pthread_mutex_lock (&mutex);
                count++;
                pthread_mutex_unlock(&mutex);
        }
        return NULL;
}

int main(int argc, const char *argv[])
{
        pthread_t id[100];
        int i = 0;
        pthread_mutex_init (&mutex,NULL);

        for(i=0;i<100;++i){
                pthread_create(&id[i],NULL,test_func,NULL);
        }

        for(i=0;i<100;++i){
                pthread_join(id[i],NULL);
        }

        printf("%d\n",count);
        return 0;
}


結果:

# time ./mutex                            
10000000
real    0m0.235s
user    0m0.040s
sys     0m0.000s

# time ./spinlock 
10000000
real    0m0.111s
user    0m0.010s
sys     0m0.010s

# time ./cas 
10000000
real    0m0.083s
user    0m0.010s
sys     0m0.000s

相關推薦

gcc原子操作spinlock簡單對比

GCC 提供的原子操作gcc從4.1.2提供了__sync_*系列的built-in函式,用於提供加減和邏輯運算的原子操作。 type __sync_fetch_and_add (type *ptr, type value, ...) type __sync_fetch_

Java並發——原子變量和原子操作阻塞算法

index 復雜 多線程 保護 註意 java並發 edm urn 相同 十五年前,多處理器系統是高度專用系統,要花費數十萬美元(大多數具有兩個到四個處理器)。現在,多處理器系統很便宜,而且數量很多,幾乎每個主要微處理器都內置了多處理支持,其中許多系統支持數十個或數百個處理

Dom4jsax 簡單對比

操作 文件的 detail log net 解析 鏈接 導航 簡單 Dom4j與sax之間的對比 dom4j不適合大文件的解析,因為它是一下子將文件加載到內存中,所以有可能出現內存溢出,sax是基於事件來對xml進行解析的,所以他可以解析大文件的xml

【C++】總體認識,c++java簡單對比

      學習了C++的一些知識,因為Java是用C寫的,而C++是對C的封裝,所以有java基礎,學C++不難。       C++在形式上比java繁瑣,比如要有main方法,函式定義,成員變數賦值,靜態成員賦值等。       但是C++有指標型別,所以在操作

sbtmaven簡單對比

sbt vs maven sbt專案用ivy2,可以使用maven的包 sbt可以進行增量編譯,這個特性還是非常有吸引力,因為scala的編譯速度是堪比c++的 sbt提供了一個scala的console,並且匯入預設的一些包,非常方便的互動 sbt在外掛上支

GCC原子操作類模板

主類模板    gcc從4.1.2版本開始提供了__sync_*系列的內建API,用於加減和邏輯運算,可以對1,2,4,8位元組長度的數值或指標型別進行原子操作,為方便使用,筆者對這些API作了簡單的封裝。  1template<typename T> 2class a

C#跨平臺手機應用開發工具Xamarin嘗試 Eclipse簡單對比

Xamarin 支援使用C#開發基於Android、IOS、WindowsPhone應用開發,最大特點C#+跨平臺,詳細說明問度娘。 安裝 研究 我也下載了研究下,破解有時候有問題,一登陸就變成試用版,需要重新生成License,挺煩人,於是寫了段批處理,放入記事本中另存為crack.bat執行,

原子操作 x86 上的 lock 指令字首

原子操作是不可分割的操作,在執行完畢時它不會被任何事件中斷。在單處理器系統(UniProcessor,簡稱 UP)中,能夠在單條指令中完成的操作都可以認為是原子操作,因為中斷只能發生在指令與指令之間。 在多處理器系統(Symmetric Multi-Processor,簡稱

ListView RecyclerView 簡單對比

RecyclerView 與 ListView 的主要區別: 佈局效果對比 常用功能與API對比 在Android L引入巢狀滾動機制(NestedScrolling) ListView與RecyclerView的簡單使用: ListView:

Linux的原子操作同步機制

.html see 原子性 cor 清除 發的 efault 多個 其他 Linux的原子操作與同步機制 轉載自:https://www.cnblogs.com/fanzhidongyzby/p/3654855.html 並發問題 現代操作系統支持多任務的並發,並發在提高計

i++不是原子操作,看似簡單,實則巨坑的一個執行緒同步的問題。synchronized 和 volatile

執行緒同步,即對多個執行緒可能同時訪問一個資源的時候。這個時候,有個互斥的要求,一般都是加鎖。synchronized。但是,有時候,僅僅這個synchronized是不夠用的,還可能會使用到一個不常用的關鍵字:volatile 下面看看這個簡單的多執行緒同步的程式碼。看看

Swift Kotlin 的簡單對比

single rom gas ati dig 3.2 cat pos 範圍 一位國外的程序員認為 Swift 的語法與 Kotlin 相似,並整理了一些 Swift 和 Kotlin 的對比,下面是一些例子,大家不妨也看看。 BASICS Hello World Swift

uiautomator——簡單的將自動化測試截圖對比連接起來使用!

查找 hash算法 elf activit style 成功 調用 .get gree 在自動化測試過程當中,除了使用id。text。view等方式進行查找元素之外,存在一種問題是界面無任何的可判定元素來判斷自動化測試是否成功時,需要用到截圖對比 # -*- coding

信號燈 ManualResetEvent Interlocked.Increment 原子操作使

ons timeout manage pre 事件 ren void 繼續 args class Program { public static int numb = 0; public static int numbb =

關於wamp的HTML, PHP, mysql 三者的操作聯系 - mysql簡單配置(三)

長度 -1 logs 建議 用戶 不用 自帶 .com upd   上一章講完HTML與PHP之間的傳值方法,這一章將wamp中mysql的使用,為下一章PHP調用數據準備。 再次說明作者的wamp版本是3.0.6 64bit   打開wamp自帶的mysql試圖數據庫

KNN 算法,以及Kmeans的簡單對比

機器 速度 優點 相關 可能 優化 四種 優缺點 16px KNN與Kmeans感覺沒啥聯系,但是名字挺像的,就拿來一起總結一下吧。 初學者的總結。 KNN是監督學習,Kmeans是無監督學習。 KNN用於分類,Kmeans用於聚類。 先說KNN: 對於KNN,有一批已

svngit操作對比 (未來有空做一個 svngit實戰對比

git reset oca add 區別 local depends pst ranch nbsp svn是集中式的,git是分布式的,但是我們日常使用的都是按照集中式唯一服務器倉庫的方式來去做的,最終我們的代碼都要提交到一個唯一倉庫中。 他們最大的區別是本地工作拷貝的工

c++11 原子類型原子操作

thread_local automic quick_exit 1、原子類型和原子操作(1)類型(2)操作(3)詳述● 原子類型只能從其模板參數類型中進行構造,標準不允許原子類型進行拷貝構造、移動構造,以及使用operator=等● atomic_flag 是一個原子的布爾類型,無鎖的,即線程對其

Linux驅動開發(13)——併發原子操作

併發 併發的概念 多個執行單元同時、並行被執行。Linux系統是多工的,很多工會同時執行。 假如有三個執行單元ABC,共享了記憶體資源。 執行單元A對Buffer寫1000個“a”; 執行單元B對Buffer寫1000個“b”; 執行單元C從buffer中讀取資料。 如果按照

Asp.Net MVC WebAPI的建立前臺Jquery ajax後臺HttpClient呼叫詳解 Asp.Net中對操作Sql Server 簡單處理的SqlDB類

1、什麼是WebApi,它有什麼用途?           Web API是一個比較寬泛的概念。這裡我們提到Web API特指ASP.NET MVC Web API。在新出的MVC中,增加了WebAPI,用於提供REST風格的WebService,新生成的W