<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 閱讀(723) 評論(0)  編輯  收藏 所屬分類: C/C++
    主站蜘蛛池模板: 亚洲AV人人澡人人爽人人夜夜| 精品亚洲成a人在线观看| 免费视频专区一国产盗摄| 亚洲精品成a人在线观看夫| 亚洲性久久久影院| 国产免费一区二区视频| 亚洲大成色www永久网址| 久久乐国产精品亚洲综合| 免费观看理论片毛片| 精选影视免费在线 | 亚洲欧洲日韩国产一区二区三区| 免费一级肉体全黄毛片| 日韩av无码久久精品免费| 国产午夜亚洲精品不卡| 亚洲综合无码一区二区| 亚洲AV网站在线观看| 亚洲国产精品无码久久九九大片 | 亚洲精品无码久久久| 91精品国产免费网站| 人人鲁免费播放视频人人香蕉| 久久夜色精品国产噜噜噜亚洲AV| 国产又长又粗又爽免费视频| 久久大香香蕉国产免费网站| 国产亚洲成在线播放va| 亚洲成在人线电影天堂色| 亚洲自偷自偷在线制服| 在线免费观看毛片网站| 亚洲成人免费网站| 中文字幕免费在线看电影大全| 理论亚洲区美一区二区三区| 亚洲高清资源在线观看| 欧洲亚洲国产清在高| 亚洲国产精品无码久久九九| 免费av欧美国产在钱| 91短视频在线免费观看| 好吊色永久免费视频大全| 美女尿口扒开图片免费| 亚洲综合一区国产精品| 亚洲欧洲日本天天堂在线观看| 亚洲色成人WWW永久网站| 亚洲国产精品一区二区第一页免|