青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

用代碼來思考自旋鎖和信號量

Posted on 2008-04-30 16:45 MichaelCao 閱讀(988) 評論(4)  編輯 收藏 引用 所屬分類: OS
    覺得昨天的思考似乎還是不怎么過癮,有些問題還不是很清楚.到底應用方面兩個有什么區別呢?
自己學著別人小小的動了下手.
先貼信號量的代碼.
#include<pthread.h>
#include<stdio.h>
#include<sys/time.h>

#define MAX 10
pthread_t thread[2];
pthread_mutex_t mut;
int number=0,i;

void * thread1()
{
    printf("thread1: I'm thread 1 \n");
    for(i =0;i<MAX ;i++)
    {
        printf("thread 1: number=%d \n",number);
        pthread_mutex_lock(&mut);
        number++;
        pthread_mutex_unlock(&mut);
        sleep(2);
    }
    printf("thread1: 主函數在等我完成任務嗎?\n");
    pthread_exit(NULL);
}
void *  thread2()
{
    printf("thread2: I'm thread 2 \n");
    for(i =0; i<MAX;i++)
    {
        printf("thread2 : number=%d\n",number);
        pthread_mutex_lock(&mut);
        number++;
        pthread_mutex_unlock(&mut);
        sleep(3);
    }
    printf("thread2 : 主函數在等我完成任務么?\n");
    pthread_exit(NULL);

}

void thread_create(void)
{
    /*創建線程*/
    pthread_create(&thread[0],NULL,thread1,NULL);
    printf("線程1被創建!\n");
    pthread_create(&thread[1],NULL,thread2,NULL);
    printf("線程2被創建!\n");
}
void thread_wait(void)
{
    /*等待線程結束*/
    pthread_join(thread[0],NULL);
    printf("線程1已經結束!\n");
    pthread_join(thread[1],NULL);
    printf("線程2已經結束!\n");
}
int main()
{
    /*用默認屬性初始化互斥鎖*/
    pthread_mutex_init(&mut,NULL);
    printf("我是主函數,我正在創建線程!\n");
    thread_create();
    printf("我是主函數,我正在等待線程完成任務!\n");
    thread_wait();
}

執行的結果是:
我是主函數,我正在創建線程!
thread1: I'm thread 1
thread 1: number=0
線程1被創建!
thread2: I'm thread 2
thread2 : number=1
線程2被創建!
我是主函數,我正在等待線程完成任務!
thread 1: number=2
thread2 : number=3
thread 1: number=4
thread 1: number=5
thread2 : number=6
thread 1: number=7
thread2 : number=8
thread 1: number=9
thread2 : number=10
thread1: 主函數在等我完成任務嗎?
線程1已經結束!
thread2 : 主函數在等我完成任務么?
線程2已經結束!

 重要:這個執行的過程大概要10秒!!!!!!
而我們用自旋鎖,代碼:
/*
 * time :2008.4.30
 * author:will cao
 * Email:sei_michael@126.com
 * 探索自旋鎖與信號量的區別
 */
#include<pthread.h>
#include<stdio.h>

pthread_t thread[2];
pthread_spinlock_t lock ;

#define MAX 10

int number=0,i;

void * thread1()
{
    printf ("thread 1 :I began to run !");
    for(i=0;i<MAX;i++)
    {
        printf("thread 1 :number=%d \n",number);
        pthread_spin_lock(&lock);
        number++;
        pthread_spin_unlock(&lock);
    }
    printf("ok ,I am over !\n");
    pthread_exit(NULL);
}
void * thread2 ()
{
    printf("thread2 : I start !!!\n");
    for(i=0;i<MAX;i++)
    {
        printf("thread2 : number = %d \n",number);
        pthread_spin_lock(&lock);
        number++;
        pthread_spin_unlock(&lock);
    }
    printf("thread 2: I am over!!!");
    pthread_exit(NULL);
}

void thread_create(void)
{
    /*create the threads */
    pthread_create(&thread[0],NULL,thread1,NULL);
    printf("create the thread 1\n ");
    pthread_create(&thread[1],NULL,thread2,NULL);
    printf("create the thread 2 \n");
}
void thread_wait(void )
{
    /*wait for the thread to be over */
    pthread_join(thread[0],NULL);
    printf("the thread 1 is over !\n");
    pthread_join(thread[1],NULL);
    printf("the thread 2 is over ! \n");
}
int main()
{
    /* init the spin lock */
    pthread_spin_init(&lock,0);
    printf("i am the main,and I am creating the threads ");
    thread_create();
    printf("i am the main,and I am wait for the thread to be over!");
    thread_wait();
}
 執行結果為:
i am the main,and I am creating the threads thread 1 :I began to run !thread 1 :number=0
thread 1 :number=1
thread 1 :number=2
thread 1 :number=3
thread 1 :number=4
thread 1 :number=5
thread 1 :number=6
thread 1 :number=7
thread 1 :number=8
thread 1 :number=9
ok ,I am over !
create the thread 1
 thread2 : I start !!!
create the thread 2
i am the main,and I am wait for the thread to be over!thread2 : number = 10
thread2 : number = 11
thread2 : number = 12
thread2 : number = 13
thread2 : number = 14
thread2 : number = 15
thread2 : number = 16
thread2 : number = 17
thread2 : number = 18
thread2 : number = 19
thread 2: I am over!!!the thread 1 is over !
the thread 2 is over !
   執行時間:我沒用系統調用,但肯定是用不了0.1秒的...
總結:從表面上來看,很明顯的區別是當我們用的是信號量的時候,這個時候是有調度的.因為從運行結果上來看,主線程在創建其他兩個線程后,其他線程開始運行.并且主線程也在運行.但怎么運行這個是無法確定的,這是一個并發的過程.
    當使用自旋鎖后,這個就不一樣了.當運行到臨界區的時候,它是直接的過去,不是會產生一個等待,或者一個調度.
不知道編譯器是怎么編譯的.很想知道編譯后二進制代碼有什么區別.但這個好像有點太難....不過我覺得從運行結果上來看這么多,應該差不多了.


Feedback

# re: 用代碼來思考自旋鎖和信號量  回復  更多評論   

2008-09-19 10:01 by 郭石
博主,你前面不是在用互斥鎖嗎?哪里用了信號量呢?

# re: 用代碼來思考自旋鎖和信號量  回復  更多評論   

2008-10-27 18:27 by mach
如果把上面代碼中的sleep去掉,估計運行時間也不會超過0.1秒 哈哈

# re: 用代碼來思考自旋鎖和信號量  回復  更多評論   

2009-03-02 11:51 by galilio
只有代碼,沒有思考

# re: 用代碼來思考自旋鎖和信號量  回復  更多評論   

2009-06-02 17:34 by falconflying
我覺得樓主是想當然了,對于spinlock的確會出現你所說的結果,但是也會出現mutex類似的結果,在我的機器上就出現了,redhat5 企業版
另外,mutex出現10秒的原因是你使用了sleep。。。。。

posts - 16, comments - 16, trackbacks - 0, articles - 0

Copyright © MichaelCao

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美日韩中文| 久久精品国产亚洲a| 欧美视频在线观看 亚洲欧| 欧美日韩直播| 欧美丝袜第一区| 国产日韩欧美在线播放不卡| 国产日韩成人精品| 一区二区三区在线观看视频| 亚洲区一区二| 欧美一级免费视频| 欧美高清在线视频| 一区二区三区精品视频在线观看| 亚洲一区二区三区免费视频| 久久国产综合精品| 嫩模写真一区二区三区三州| 欧美日韩成人免费| 国产中文一区二区三区| 亚洲娇小video精品| 西瓜成人精品人成网站| 欧美黄色免费网站| 午夜精品久久久久久久99水蜜桃| 欧美伊人精品成人久久综合97| 老色鬼精品视频在线观看播放| 国产精品成人观看视频免费 | 亚洲国产你懂的| 日韩亚洲精品在线| 久久国产一区| 国产精品久久综合| 欧美中文字幕视频| 欧美高清在线精品一区| 国产亚洲第一区| 日韩午夜激情电影| 久久久91精品国产一区二区三区| 亚洲精品一区二区三| 久久婷婷影院| 国产小视频国产精品| 亚洲一区二区毛片| 亚洲国产专区| 裸体一区二区三区| 激情91久久| 久久亚洲国产精品日日av夜夜| 亚洲午夜精品久久久久久浪潮| 欧美福利视频一区| 亚洲区欧美区| 欧美激情影音先锋| 麻豆成人在线播放| 在线观看视频日韩| 久久综合导航| 久久久国产一区二区三区| 国产亚洲精品福利| 久久av红桃一区二区小说| 一本大道久久a久久精品综合| 欧美精品成人| 中国成人黄色视屏| 亚洲精品国产欧美| 欧美日本不卡高清| 亚洲一级在线| 中文一区二区在线观看| 欧美性猛交视频| 亚洲免费视频一区二区| 在线亚洲电影| 国产精品国产a级| 亚洲自拍都市欧美小说| 午夜精品久久久久久久| 国产日韩一区在线| 久久字幕精品一区| 欧美电影免费观看高清完整版| 亚洲激情一区二区三区| 亚洲国产精品福利| 国产精品激情偷乱一区二区∴| 亚洲综合欧美日韩| 欧美一区二区三区免费在线看| 韩国女主播一区二区三区| 久久久一区二区三区| 久久亚洲精选| 亚洲精品影院在线观看| 99精品视频免费观看| 国产精品久久久久91| 久久男人资源视频| 欧美成人福利视频| 亚洲一级在线| 久久精品一区二区| 9久草视频在线视频精品| 亚洲一区二区在线观看视频| 国产一区在线观看视频| 亚洲福利免费| 国产日韩av一区二区| 欧美激情乱人伦| 国产精品看片资源| 欧美成人精品影院| 欧美高清视频一区二区| 免播放器亚洲一区| 日韩视频三区| 国产日韩一区二区三区在线播放| 美女在线一区二区| 久久综合999| 亚洲欧美中文日韩v在线观看| 香蕉视频成人在线观看 | 99国产精品一区| 亚洲影院污污.| 亚洲黄色在线观看| 欧美亚洲日本一区| 一区二区三区高清视频在线观看| 午夜国产精品视频免费体验区| 亚洲黄色影片| 欧美一区二区三区精品| 一区二区三区精密机械公司 | 亚洲精品一区二区三区四区高清| 在线视频精品一| 亚洲狠狠丁香婷婷综合久久久| 亚洲图片欧洲图片日韩av| 亚洲精品午夜| 久久一区二区三区四区五区| 久久av红桃一区二区小说| 欧美午夜免费电影| 亚洲国产精品久久久久婷婷老年 | 一本一本久久a久久精品综合麻豆| 香蕉成人伊视频在线观看| 亚洲视频精品| 欧美成年人视频| 嫩草影视亚洲| 狠狠操狠狠色综合网| 欧美一级久久久久久久大片| 亚洲一二三级电影| 欧美日韩爆操| 99re热这里只有精品免费视频| 亚洲美女毛片| 久久只精品国产| 免费亚洲电影在线| 亚洲电影专区| 久久综合电影| 欧美二区在线看| 亚洲精品一区二区三区99| 老司机一区二区三区| 欧美成人xxx| 亚洲精品在线视频| 欧美精品一区在线发布| 99精品欧美| 亚洲欧美日韩在线一区| 国产精品久久久999| 亚洲特级片在线| 欧美专区在线观看一区| 国产真实精品久久二三区| 久久精品国产999大香线蕉| 免费久久99精品国产自在现线| 91久久精品www人人做人人爽 | 亚洲国产日韩一级| 亚洲最快最全在线视频| 亚洲欧美文学| 欧美激情在线观看| 欧美77777| 99综合在线| 国产精品欧美在线| 欧美在线看片| 欧美激情亚洲一区| 一区二区动漫| 国产午夜精品理论片a级探花| 久久久久久久久久久一区 | 欧美成人精品| 一区二区三区国产精华| 国产婷婷精品| 欧美国产精品一区| 亚洲一区二区三区四区中文| 久久一区国产| 亚洲精品视频一区二区三区| 国产精品高潮粉嫩av| 久久九九久精品国产免费直播| 欧美激情一区二区在线| 欧美伊人精品成人久久综合97| 极品尤物av久久免费看| 欧美日韩国产经典色站一区二区三区| 一区二区三区高清| 欧美电影在线播放| 亚洲欧美国产高清va在线播| 在线电影院国产精品| 欧美日韩一区二区国产| 久久久国产精彩视频美女艺术照福利| 亚洲国产欧美一区二区三区同亚洲| 性色av一区二区三区| 亚洲美女中出| 国产麻豆视频精品| 欧美a级大片| 久久成人国产| 一区二区三区免费网站| 欧美国产日韩一区二区| 久久久久国产一区二区三区四区 | 美女视频黄 久久| 日韩天堂av| 黄色在线成人| 国产日韩av高清| 欧美人成在线视频| 久久久一二三| 亚洲无人区一区| 亚洲电影免费在线| 久久久久国内| 久久久久久久国产| 欧美一区在线看| 午夜激情久久久| 亚洲欧美日韩国产中文| 亚洲午夜小视频|