码迷,mamicode.com
首页 > 编程语言 > 详细

跟我一起做面试题-linux线程编程(4)

时间:2014-09-02 19:23:45      阅读:315      评论:0      收藏:0      [点我收藏+]

标签:des   style   blog   http   color   os   io   ar   for   

如题所述:

有四个线程1、2、3、4。线程1的功能就是输出1,线程2的功能就是输出2,以此类推.........现在有四个文件ABCD。初始都为空。现要让四个文件呈如下格式:

A:1 2 3 4 1 2....

B:2 3 4 1 2 3....

C:3 4 1 2 3 4....

D:4 1 2 3 4 1....

请设计程序。

 

bubuko.com,布布扣
  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <string.h>
  4 #include <pthread.h>
  5 #include <errno.h>
  6 #include <stdarg.h>
  7 #include <unistd.h>
  8 #include <limits.h>
  9 #include <sys/ipc.h>
 10 #include <sys/msg.h>
 11 #include <sys/types.h>  
 12 #include <sys/time.h>
 13 #include <signal.h>
 14  
 15  
 16 #define NUM     4
 17 #define RUN     0
 18 #define OVER    1
 19 
 20 FILE *fp[NUM];
 21 int who[NUM];
 22 int shutdown;
 23 pthread_mutex_t mylock = PTHREAD_MUTEX_INITIALIZER;
 24 pthread_cond_t  cond = PTHREAD_COND_INITIALIZER;
 25 
 26 
 27 #define myprintf( ... )  28     do{  29     mprintf(__FILE__, __FUNCTION__, __LINE__,##__VA_ARGS__);  30     }while(0)
 31 
 32 
 33 
 34 
 35 int mprintf(const char *file_name, const char *func_name, int line, const char *fmt, ...)
 36 {
 37     va_list     strArgPtr;
 38     int la,lb;
 39     la = fprintf(stdout, "[%-15s]-[%-10s]-[%04d]", file_name, func_name, line);
 40     va_start(strArgPtr, fmt);
 41     lb = vfprintf(stdout, fmt, strArgPtr);
 42     va_end(strArgPtr);
 43     printf("\n");
 44     fflush(stdout);
 45     return (la+lb);
 46 }
 47 
 48 void * func(void *arg)
 49 {
 50     int i;
 51     int name = (int)arg;
 52     char tmp[50];
 53     sprintf(tmp, "%d ", name+1);
 54     for(;;)
 55     {
 56         for( i = 0 ; i < NUM ; i++)
 57         {
 58            // int aim = who[i];
 59             if( pthread_mutex_lock(&mylock))
 60             {
 61                 myprintf("pthread_mutex_lock error errmsg[%s]\n", strerror(errno));
 62                 exit(0);
 63             }
 64             while(1)
 65             {
 66                 if(shutdown == OVER)
 67                 {
 68                     myprintf("thread%d exit", name);
 69                     pthread_exit(NULL);    
 70                 }
 71                 if(who[i] == name)
 72                 {
 73                     fwrite(tmp, 2, 1, fp[i]);
 74                     fflush(fp[i]);
 75                     who[i] = (who[i]+1)%NUM;
 76                     break;
 77                 }            
 78                 if(pthread_cond_wait(&cond, &mylock))
 79                 {
 80                     myprintf("wait error errmsg[%s]\n", strerror(errno));
 81                     exit(0);
 82                 }
 83             }
 84             if(pthread_mutex_unlock(&mylock))
 85             {
 86                 myprintf("pthread_mutex_unlock error errmsg[%s]\n", strerror(errno));
 87                 exit(0);
 88             }
 89             if(pthread_cond_broadcast(&cond))
 90             {
 91                 myprintf("pthread_cond_broadcast error errmsg[%s]\n", strerror(errno));
 92                 exit(0);
 93             }
 94         }
 95     }
 96 }
 97 
 98 void allover(int sig)
 99 {
100         if( pthread_mutex_lock(&mylock))
101         {
102             myprintf("pthread_mutex_lock error errmsg[%s]\n", strerror(errno));
103             exit(0);
104         }
105         shutdown = OVER;
106         if( pthread_mutex_unlock(&mylock))
107         {
108             myprintf("pthread_mutex_lock error errmsg[%s]\n", strerror(errno));
109             exit(0);
110         }
111         if(pthread_cond_broadcast(&cond))
112         {
113             myprintf("pthread_cond_broadcast error errmsg[%s]\n", strerror(errno));
114             exit(0);
115         }
116 }
117 
118 
119 int appInit()
120 {
121     shutdown = RUN;
122     char filename[NUM][50];
123     int i;
124     for( i = 0; i<NUM; i++)
125     {
126         sprintf(filename[i], "%c", A+i);
127         fp[i] = fopen(filename[i], "w");
128         if(fp[i] == NULL)
129         {
130             myprintf("fopen failure");
131             exit(0);    
132         }
133         who[i] = i;    
134     }
135     if ( signal(SIGUSR1, allover)== SIG_ERR)
136     {
137         myprintf("signal  failure");    
138         return -1;    
139     }
140 //    pthread_mutex_init(&mylock, NULL);
141 //    pthread_cond_init(&cond, NULL);
142     return 0; 
143 }
144 
145 int appDone()
146 {
147     int i;
148     for( i = 0; i<NUM; i++)
149     {
150        fclose(fp[i]);
151     }
152 //    pthread_cond_destroy(&cond);
153 //    pthread_mutex_destroy(&mylock);
154     return 0;
155 }
156 
157 int main(int argc, char *argv[])
158 {
159  
160     pthread_t th[NUM];
161     int ret;
162     int i;
163     ret = appInit();
164     if(ret)
165     {
166         myprintf("appinit failure");
167         return -1;    
168     }
169     for( i = 0; i < NUM; i++)
170     {
171         ret = pthread_create(&th[i], NULL, func, (void*)i);
172         if(ret)
173         {
174             myprintf("pthread_create ta error [%s]", strerror(errno));
175             return 1;
176         }        
177     }
178     
179     for( i = 0; i < NUM; i++)
180         pthread_join(th[i], NULL);
181     
182     myprintf("main thread exit");
183     ret = appDone();
184     if(ret)
185     {
186         myprintf("appDone failure");
187         return -1;    
188     }
189     return 0;
190 }
View Code

 

代码没有加延时,如果哪位朋友运行生成大文件,不要怪我。

 

跟我一起做面试题-linux线程编程(4)

标签:des   style   blog   http   color   os   io   ar   for   

原文地址:http://www.cnblogs.com/boota/p/3951972.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!