#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 |