<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    一江春水向東流

    做一個有思想的人,期待與每一位熱愛思考的人交流,您的關注是對我最大的支持。

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      44 隨筆 :: 139 文章 :: 81 評論 :: 0 Trackbacks

    一個很好的多線程和互斥鎖學習例程,是一個生產者-消費者的模型


    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <pthread.h>
    #define BUFFER_SIZE 16

    struct prodcons
    {
    ?? int buffer[BUFFER_SIZE];
    ?? pthread_mutex_t lock;/*互斥鎖*/
    ?? int readpos, writepos;
    ?? pthread_cond_t notempty;/*緩沖區非空信號*/
    ?? pthread_cond_t notfull;/*緩沖區非滿信號*/
    };

    void init(struct prodcons *b)
    {
    ?? pthread_mutex_init(&b->lock, NULL);
    ?? pthread_cond_init(&b->notempty, NULL);
    ?? pthread_cond_init(&b->notfull, NULL);
    ?? b->readpos = 0;
    ?? b->writepos = 0;
    }
    void put(struct prodcons *b, int data)
    {
    ?? pthread_mutex_lock(&b->lock);//獲取互斥鎖
    ?? while((b->writepos + 1) % BUFFER_SIZE == b->readpos)
    ?? {
    ????? printf("wait for not full\n");
    ????? pthread_cond_wait(&b->notfull, &b->lock);//不滿時逃出阻塞
    ?? }
    ?? b->buffer[b->writepos] = data;
    ?? b->writepos++;
    ?? if(b->writepos >= BUFFER_SIZE) b->writepos = 0;
    ?? pthread_cond_signal(&b->notempty);//設置狀態變量
    ?? pthread_mutex_unlock(&b->lock);//釋放互斥鎖
    }

    int get(struct prodcons *b)
    {
    ?? int data;
    ?? pthread_mutex_lock(&b->lock);
    ?? while(b->writepos == b->readpos)
    ?? {
    ???? printf("wait for not empty\n");
    ???? pthread_cond_wait(&b->notempty, &b->lock);
    ?? }
    ?? data = b->buffer[b->readpos];
    ?? b->readpos++;
    ?? if(b->readpos >= BUFFER_SIZE) b->readpos = 0;
    ?? pthread_cond_signal(&b->notfull);
    ?? pthread_mutex_unlock(&b->lock);
    ?? return data;
    }

    #define OVER (-1)
    struct prodcons buffer;

    void *producer(void *data)
    {
    ?? int n;
    ?? for(n=0; n<1000; n++)
    ?? {
    ????? printf("put->%d\n",n);
    ????? put(&buffer, n);
    ?? }
    ?? put(&buffer, OVER);
    ?? printf("producer stopped\n");
    ?? return NULL;
    }

    void *consumer(void *data)
    {
    ?? int d;
    ?? while(1)
    ?? {
    ????? d = get(&buffer);
    ????? if(d == OVER)
    ????? break;
    ????? printf("???????????? %d->get\n",d);
    ?? }
    ?? printf("consumer stopped!\n");
    ?? return NULL;
    }
    int main(void)
    {
    ?? pthread_t th_a, th_b;
    ?? void *retval;
    ?? init(&buffer);
    ?? pthread_create(&th_a, NULL, producer, 0);
    ?? pthread_create(&th_b, NULL, consumer, 0);
    ?? pthread_join(th_a, &retval);
    ?? pthread_join(th_b, &retval);
    ?? return 0;
    }
    pthread_cond_wait函數,是線程阻塞在一個條件變量上,原型為:
    extern int pthread_cond_wait(pthread_cond_t *_restrict_cond, pthread_mutex_t* _restrict_mutex)
    線程解開mutex指向的鎖并被條件變量cond阻塞,線程可以被函數pthread_cond_signal和pthread_cond_broadcast喚醒。
    還有另一個函數pthread_cond_timedwait函數,他比vpthread_cond_wait函數多一個時間參數,經歷給定時間後,阻塞將被解除。

    posted on 2007-05-03 13:44 allic 閱讀(733) 評論(0)  編輯  收藏 所屬分類: C/C++
    主站蜘蛛池模板: 999久久久免费精品播放 | 免费a级毛片无码a∨免费软件| 我想看一级毛片免费的| 亚洲AV中文无码乱人伦下载| 一级做a爰片久久毛片免费看| 亚洲高清成人一区二区三区| 四虎影视久久久免费观看| 亚洲精品成人久久久| www在线观看免费视频| 亚洲色精品88色婷婷七月丁香| 国产性生大片免费观看性| 亚洲国产婷婷六月丁香| 久久久久国产精品免费网站| 亚洲国产综合91精品麻豆| 国产精品视频免费观看| 亚洲色大成网站www久久九| 在线观看国产情趣免费视频| 国产亚洲漂亮白嫩美女在线 | 国产精品麻豆免费版| 亚洲激情视频在线观看| 狠狠综合亚洲综合亚洲色| 亚洲国产天堂久久综合| 精品视频在线免费观看| 亚洲福利电影在线观看| 日本黄色免费观看| 丁香花在线观看免费观看图片| 亚洲Av永久无码精品三区在线| 永久免费在线观看视频| 亚洲国产精品日韩av不卡在线 | 狼友av永久网站免费观看| 一区二区三区免费精品视频| 国产亚洲精品观看91在线| 国产国产人免费视频成69堂| 亚洲丁香婷婷综合久久| 欧洲亚洲国产清在高| 免费人成视频在线| 国产免费久久精品99久久| 亚洲13又紧又嫩又水多| 亚洲视频在线精品| 国产日本一线在线观看免费| 污污污视频在线免费观看|