rdblab.c

来自「vxwork操作系统的相关内容」· C语言 代码 · 共 173 行

C
173
字号
/* rdbLab.c - Using CrossWind, nyuk, nyuk, nyuk! */#include                                "vxWorks.h"#include                                "stdio.h"#include                                "stdlib.h"#include                                "taskLib.h"#include                                "semLib.h"#define NUM_STOOGES                     4

typedef struct stoogeStruct{    char *                              name;    struct stoogeStruct *               next;} STOOGE,*STOOGE_LIST;/* global variables */char *                                  stoogeName[NUM_STOOGES]={"Larry","Moe","Curly","Shempf"};volatile int                            number=0;SEM_ID                                  mutex=NULL;             /* mutual exclusion semaphore for number *//* foward declarations */STOOGE_LIST                             stoogeMakeList(void);void                                    stoogeTalk(STOOGE_LIST stoogeList);void                                    stoogeFreeList(STOOGE_LIST stoogeList);void                                    stoogeNumberInc(void);void                                    stoogeMutex(void);/********************************************************************************* stoogeStart - do the stooge thing.** This routine creates a linked list of stooges. Each stooge in turn says* "Nyuk, nyuk, nyuk". The list is then freed up.** RETURNS: VOID*/void                                    stoogeStart(void){    STOOGE_LIST                         stoogeList;        if (mutex==NULL)                                            /* first time through, create mutex */        stoogeMutex();    stoogeList=stoogeMakeList();    printf("\n%5s (%2d) : Oh, a wise guy, eh?\n",taskName(0),number);    stoogeTalk(stoogeList);    stoogeFreeList(stoogeList);}/*************************************************************************** stoogeMutex - create mutex for <number>** This routine creates a mutual exclusion semaphore <mutex> guarding* access to the global integer <number>. * * Semaphores will be covered in detail in a later chapter.*/void                                    stoogeMutex(void){    if ((mutex=semMCreate(SEM_Q_PRIORITY|SEM_INVERSION_SAFE|SEM_DELETE_SAFE))==NULL)    {        printf("stoogeInit: Creation of mutex failed. Exiting.\n");        exit(0);    }}/********************************************************************************* stoogeMakeList - make a linked list of stooges.** RETURNS: a pointer to this list.*/STOOGE_LIST                             stoogeMakeList(void){    STOOGE *                            oldStooge=NULL;    STOOGE *                            newStooge;    int                                 i;        for (i=0;i<NUM_STOOGES;i++)    {        newStooge=(STOOGE *)malloc(sizeof(STOOGE));        newStooge->next=oldStooge;        newStooge->name=stoogeName[NUM_STOOGES-i-1];                oldStooge=newStooge;    }        stoogeNumberInc();    return (newStooge);}/********************************************************************************* stoogeTalk - let each stooge say "Nyuk, nyuk, nyuk"** RETURNS: VOID*/void                                    stoogeTalk(STOOGE_LIST stoogeList){    STOOGE *                            stooge=stoogeList;        while (stooge!=NULL)    {        printf("%10s : Nyuk, nyuk, nyuk\n",stooge->name);        stooge=stooge->next;    }        stoogeNumberInc();}/******************************************************************************** stoogeFreeList - free the linked list of stooges.** RETURNS: VOID*/void                                    stoogeFreeList(STOOGE_LIST stoogeList){    STOOGE *                            stooge;
    STOOGE *                            nextStooge;
        stooge=stoogeList;        while (stooge!=NULL)    {        nextStooge=stooge->next;        free(stooge);        stooge=nextStooge;    }        stoogeNumberInc();}/******************************************************************************** stoogeListSize - find out the size of the stoogeList.** RETURNS: the size of the linked list.*/int                                     stoogeListSize(STOOGE_LIST stoogeList){    int                                 i=0;    STOOGE *                            stooge=stoogeList;        while (stooge!=NULL)    {        i++;        stooge=stooge->next;    }        return(i);}/**************************************************************************** stoogeNumberInc - increment ye olde number, modulo ye olde 100** The increment is done within a mutual exclusion critical region* to avoid a possible race condition when more than one task executes* this program concurrently. Mutual exclusion issues will be discussed* in a later chapter.*/void                                    stoogeNumberInc(void){    if (semTake(mutex,WAIT_FOREVER)!=OK)        return;        if ((++number)==100)        number=0;        semGive(mutex);}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?