본문 바로가기

IT

two word count 4

#include <stdio.h>

#include <pthread.h>

#include <ctype.h>


struct arg_set{

        char* fname;

        int count;

};


struct arg_set *mailbox;

pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;                                    // mutex lock과

pthread_cond_t flag = PTHREAD_COND_INITIALIZER;                                        // 컨디션 플래그 선언.


main(int ac, char *av[])

{

        pthread_t t1, t2;

        struct arg_set args1, args2;                                    // 스레드 별로 하나씩 아규먼트를 줄거임.

        void *count_word(void*);

        int report = 0;

        int total = 0;


        if (ac != 3)

        {

                perror("usage");

        }

        pthread_mutex_lock(&lock);


        args1.fname = av[1];

        args1.count = 0;

        pthread_create(&t1,NULL,count_word,(void*)&args1);


        args2.fname = av[2];

        args2.count = 0;

        pthread_create(&t2,NULL,count_word,(void*)&args2);


        while(report < 2)

        {

                printf("main waiting \n");                                                                // 컨디션 플래그가 올라올때까지 기다릴거임

                pthread_cond_wait(&flag,&lock);

                printf("main lock \n");                                                                   // 플래그 올라왔음, block 함

                printf("%7d %s\n", mailbox->count, mailbox->fname);

                total += mailbox->count;

                if(mailbox == &args1)

                        pthread_join(t1,NULL);

                if(mailbox==&args2)

                        pthread_join(t2,NULL);

                mailbox=NULL;

                pthread_cond_signal(&flag);                                                                // unblock

                report++;

        }

        printf("%7d total \n", total);

}


void *count_word(void *a)

{

        struct arg_set *args = a;

        FILE *fp;

        int c, prevc = '\0';


        if ((fp=fopen(args->fname,"r")) != NULL)

        {

                while((c=getc(fp))!=EOF)

                {

                        if(!isalnum(c) && isalnum(prevc))                                         // current가 문자가 아니고, prev가 문자면 단어로 인식

                                args->count++;

                        prevc = c;

                }

                fclose(fp);

        }

        else

                perror(args->fname);


        printf("count lock \n");

        pthread_mutex_lock(&lock);                                                                            // 뮤텍스 락

        printf("count store \n");

        if (mailbox != NULL)                                                           // 메일박스에 다른게 있으면 안함. (메일박스 크기 = 1 이라고 가정)

                pthread_cond_wait(&flag, &lock);                                                // 컨디션 플래그 락

        mailbox = args;                                                                                    // 메일박스 변경

        printf("count flag \n");

        pthread_cond_signal(&flag);                                                                // 컨디션 플래그 언락

        printf("count unlock\n");

        pthread_mutex_unlock(&lock);                                                                // 뮤텍스 언락

        return NULL;

}



'IT' 카테고리의 다른 글

socket...........  (0) 2014.12.14
(설계) Messenger with system call  (0) 2014.12.12
two word 2  (0) 2014.12.09
two word count 1 .c  (0) 2014.12.09
print.c  (0) 2014.12.09