#include #include #include #include #include #include #include #include #include unsigned int licznik = 0; unsigned int linia = 1; unsigned int liczba_watkow; pthread_rwlock_t licznik_lock = PTHREAD_RWLOCK_INITIALIZER; pthread_mutex_t cond_mutex = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t cond = PTHREAD_COND_INITIALIZER; pthread_mutex_t cond2_mutex = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t cond2 = PTHREAD_COND_INITIALIZER; typedef struct { int fd; unsigned int linia; } worker_arg; void *worker_t(void *arg){ worker_arg *wa = (worker_arg *)arg; char buf[128]; #ifdef DEBUG printf("worker %d %d\n",wa->fd,wa->linia); fflush(stdout); #endif while (1) { pthread_testcancel(); #ifdef DEBUG printf("worker %d lockwait\n",wa->linia); fflush(stdout); #endif pthread_mutex_lock(&cond_mutex); #ifdef DEBUG printf("worker %d lock\n",wa->linia); fflush(stdout); #endif while (wa->linia!=linia) { if (pthread_cond_wait(&cond,&cond_mutex)!=0) { perror("pthread_cond_wait"); exit(-1); } #ifdef DEBUG printf("worker %d cond\n",wa->linia); fflush(stdout); #endif }; #ifdef DEBUG printf("in worker %d\n",wa->linia); fflush(stdout); #endif if (fgets(buf,128,stdin) != 0) { write(wa->fd,buf,strlen(buf)); pthread_rwlock_wrlock(&licznik_lock); licznik++; pthread_rwlock_unlock(&licznik_lock); } else { pthread_mutex_unlock(&cond_mutex); pthread_cond_signal(&cond2); return 0; } if (linia == liczba_watkow) linia = 1; else linia++; sleep(1); #ifdef DEBUG printf("worker %d switch\n",wa->linia); fflush(stdout); #endif pthread_mutex_unlock(&cond_mutex); pthread_cond_broadcast(&cond); } }; int main (int argc, char **argv) { pthread_t *tidy; int *fds; int n; if (argc<2) { fprintf(stderr,"%s: plik1 (..) plikn\n",argv[0]); return -1; }; liczba_watkow = argc-1; tidy = (pthread_t *)malloc(sizeof(pthread_t)*(liczba_watkow)); if (tidy==0) { perror("malloc"); return -1; }; fds = (int *)malloc(sizeof(int)*(liczba_watkow)); if (fds==0) { perror("malloc"); return -1; }; pthread_mutex_lock(&cond_mutex); pthread_mutex_lock(&cond2_mutex); for (n=0;nlinia=n+1; wa->fd=open(argv[n+1],O_WRONLY|O_CREAT|O_TRUNC,S_IWUSR|S_IRUSR); if (wa->fd==-1) { perror("open"); return -1; } if (pthread_create(&(tidy[n]),0,worker_t,wa)!=0) { perror("pthread_create"); return -1; } }; pthread_mutex_unlock(&cond_mutex); pthread_cond_broadcast(&cond); struct timespec tm; tm.tv_sec = 10; tm.tv_nsec = 0; pthread_cond_reltimedwait_np(&cond2,&cond2_mutex,&tm); #ifdef DEBUG printf("Timeout!\n"); fflush(stdout); #endif pthread_mutex_unlock(&cond2_mutex); for (n=0;n