新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 多線程編程之:實驗內容——“生產者消費者”實驗

        多線程編程之:實驗內容——“生產者消費者”實驗

        作者: 時間:2013-09-13 來源:網絡 收藏

        本文引用地址:http://www.104case.com/article/257119.htm

        (3)編寫代碼

        的代碼中采用的有界緩沖區擁有3個單元,每個單元為5個字節。為了盡量體現每個信號量的意義,在程序中生產過程和消費過程是隨機(采取0~5s的隨機時間間隔)進行的,而且生產者的速度比消費者的速度平均快兩倍左右(這種關系可以相反)。生產者一次生產一個單元的產品(放入“hello”字符串),消費者一次消費一個單元的產品。

        /*producer-customer.c*/

        #includestdio.h>

        #includestdlib.h>

        #includeunistd.h>

        #includefcntl.h>

        #includepthread.h>

        #includeerrno.h>

        #includesemaphore.h>

        #includesys/ipc.h>

        #defineMYFIFOmyfifo/*緩沖區有名管道的名字*/

        #defineBUFFER_SIZE3/*緩沖區的單元數*/

        #defineUNIT_SIZE5/*每個單元的大小*/

        #defineRUN_TIME30/*運行時間*/

        #defineDELAY_TIME_LEVELS5.0/*周期的最大值*/

        intfd;

        time_tend_time;

        sem_tmutex,full,avail;/*3個信號量*/

        /*生產者線程*/

        void*producer(void*arg)

        {

        intreal_write;

        intdelay_time=0;

        while(time(NULL)end_time)

        {

        delay_time=(int)(rand()*DELAY_TIME_LEVELS/(RAND_MAX)/2.0)+1;

        sleep(delay_time);

        /*P操作信號量avail和mutex*/

        sem_wait(avail);

        sem_wait(mutex);

        printf(nProducer:delay=%dn,delay_time);

        /*生產者寫入數據*/

        if((real_write=write(fd,hello,UNIT_SIZE))==-1)

        {

        if(errno==EAGAIN)

        {

        printf(TheFIFOhasnotbeenreadyet.Pleasetrylatern);

        }

        }

        else

        {

        printf(Write%dtotheFIFOn,real_write);

        }

        /*V操作信號量full和mutex*/

        sem_post(full);

        sem_post(mutex);

        }

        pthread_exit(NULL);

        }

        /*消費者線程*/

        void*customer(void*arg)

        {

        unsignedcharread_buffer[UNIT_SIZE];

        intreal_read;

        intdelay_time;

        while(time(NULL)end_time)

        {

        delay_time=(int)(rand()*DELAY_TIME_LEVELS/(RAND_MAX))+1;

        sleep(delay_time);

        /*P操作信號量full和mutex*/

        sem_wait(full);

        sem_wait(mutex);

        memset(read_buffer,0,UNIT_SIZE);

        printf(nCustomer:delay=%dn,delay_time);

        if((real_read=read(fd,read_buffer,UNIT_SIZE))==-1)

        {

        if(errno==EAGAIN)

        {

        printf(Nodatayetn);

        }

        }

        printf(Read%sfromFIFOn,read_buffer);

        /*V操作信號量avail和mutex*/

        sem_post(avail);

        sem_post(mutex);

        }

        pthread_exit(NULL);

        }

        intmain()

        {

        pthread_tthrd_prd_id,thrd_cst_id;

        pthread_tmon_th_id;

        intret;

        srand(time(NULL));

        end_time=time(NULL)+RUN_TIME;

        /*創建有名管道*/

        if((mkfifo(MYFIFO,O_CREAT|O_EXCL)0)(errno!=EEXIST))

        {

        printf(Cannotcreatefifon);

        returnerrno;

        }

        /*打開管道*/

        fd=open(MYFIFO,O_RDWR);

        if(fd==-1)

        {

        printf(Openfifoerrorn);

        returnfd;

        }

        /*初始化互斥信號量為1*/

        ret=sem_init(mutex,0,1);

        /*初始化avail信號量為N*/

        ret+=sem_init(avail,0,BUFFER_SIZE);

        /*初始化full信號量為0*/

        ret+=sem_init(full,0,0);

        if(ret!=0)

        {

        printf(Anysemaphoreinitializationfailedn);

        returnret;

        }

        /*創建兩個線程*/

        ret=pthread_create(thrd_prd_id,NULL,producer,NULL);

        if(ret!=0)

        {

        printf(Createproducerthreaderrorn);

        returnret;

        }

        ret=pthread_create(thrd_cst_id,NULL,customer,NULL);

        if(ret!=0)

        {

        printf(Createcustomerthreaderrorn);

        returnret;

        }

        pthread_join(thrd_prd_id,NULL);

        pthread_join(thrd_cst_id,NULL);

        close(fd);

        unlink(MYFIFO);

        return0;

        }

        linux操作系統文章專題:linux操作系統詳解(linux不再難懂)

        tcp/ip相關文章:tcp/ip是什么




        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 高州市| 高尔夫| 乌鲁木齐市| 伊通| 富平县| 于田县| 原平市| 同德县| 冀州市| 长泰县| 浦城县| 林芝县| 德惠市| 灵璧县| 咸丰县| 岱山县| 商河县| 宜州市| 綦江县| 甘肃省| 通渭县| 宜良县| 丹巴县| 孝昌县| 黑山县| 长宁区| 敖汉旗| 沙坪坝区| 秭归县| 杭锦旗| 浦北县| 山西省| 枣阳市| 阿合奇县| 长岛县| 嘉鱼县| 富民县| 治多县| 乌拉特前旗| 措勤县| 大理市|