有四个线程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....
#include <stdio.h>
#include <pthread.h>
#include <string.h>
#include <signal.h>
#include <stdlib.h>
typedef void (*sighandler_t)(int);
pthread_mutex_t mutexA = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t mutexB = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t mutexC = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t mutexD = PTHREAD_MUTEX_INITIALIZER;
FILE *fd1,*fd2,*fd3,*fd4;
sighandler_t sig_handler(int sig){
fclose(fd1);
fclose(fd2);
fclose(fd3);
fclose(fd4);
exit(1);
}
int flag11=1,flag12=0, flag13=0, flag14=0, flag21=1, flag22=0, flag23=0, flag24=0, flag31=1, flag32=0, flag33=0, flag34=0, flag41=1, flag42=0, flag43=0, flag44=0;
void *
t1 (void *argv)
{
char c = '1';
unsigned int p[4];
memcpy (p, (void *) argv, 4 * sizeof (unsigned int));
FILE *fd;
int i;
for (i=0;i<1000000000;i++)
{
if (flag11 == 1)
{
pthread_mutex_lock (&mutexA);
fd = (FILE *) p[0];
fwrite (&c, 1, 1, fd);
flag11=0;
flag22 = 1;
pthread_mutex_unlock (&mutexA);
}
if (flag12 == 1)
{
pthread_mutex_lock (&mutexD);
fd = (FILE *) p[3];
fwrite (&c, 1, 1, fd);
flag12 = 0;
flag23=1;
pthread_mutex_unlock (&mutexD);
}
if (flag13 == 1)
{
pthread_mutex_lock (&mutexC);
fd = (FILE *) p[2];
fwrite (&c, 1, 1, fd);
flag13 = 0;
flag24=1;
pthread_mutex_unlock (&mutexC);
}
if (flag14 == 1)
{
pthread_mutex_lock (&mutexB);
fd = (FILE *) p[1];
fwrite (&c, 1, 1, fd);
flag14=0;
flag21=1;
pthread_mutex_unlock (&mutexB);
}
}
}
void *
t2 (void *argv)
{
char c = '2';
unsigned int p[4];
memcpy (p, (void *) argv, 4 * sizeof (unsigned int));
FILE *fd;
int i;
for (i=0;i<1000000000;i++)
{
if (flag21 == 1)
{
pthread_mutex_lock (&mutexB);
fd = (FILE *) p[1];
fwrite (&c, 1, 1, fd);
flag21 = 0;
flag32=1;
pthread_mutex_unlock (&mutexB);
}
if (flag22 == 1)
{
pthread_mutex_lock (&mutexA);
fd = (FILE *) p[0];
fwrite (&c, 1, 1, fd);
flag22 = 0;
flag33=1;
pthread_mutex_unlock (&mutexA);
}
if (flag23 == 1)
{
pthread_mutex_lock (&mutexD);
fd = (FILE *) p[3];
fwrite (&c, 1, 1, fd);
flag23 = 0;
flag34=1;
pthread_mutex_unlock (&mutexD);
}
if (flag24 == 1)
{
pthread_mutex_lock (&mutexC);
fd = (FILE *) p[2];
fwrite (&c, 1, 1, fd);
flag24 = 0;
flag31=1;
pthread_mutex_unlock (&mutexC);
}
}
}
void *
t3 (void *argv)
{
char c = '3';
unsigned int p[4];
memcpy (p, (void *) argv, 4 * sizeof (unsigned int));
FILE *fd;
int i;
for (i=0;i<1000000000;i++)
{
if (flag31 == 1)
{
pthread_mutex_lock (&mutexC);
fd = (FILE *) p[2];
fwrite (&c, 1, 1, fd);
flag31 = 0;
flag42=1;
pthread_mutex_unlock (&mutexC);
}
if (flag32 == 1)
{
pthread_mutex_lock (&mutexB);
fd = (FILE *) p[1];
fwrite (&c, 1, 1, fd);
flag32 = 0;
flag43=1;
pthread_mutex_unlock (&mutexB);
}
if (flag33 == 1)
{
pthread_mutex_lock (&mutexA);
fd = (FILE *) p[0];
fwrite (&c, 1, 1, fd);
flag33 = 0;
flag44=1;
pthread_mutex_unlock (&mutexA);
}
if (flag34 == 1)
{
pthread_mutex_lock (&mutexD);
fd = (FILE *) p[3];
fwrite (&c, 1, 1, fd);
flag34 = 0;
flag41=1;
pthread_mutex_unlock (&mutexD);
}
}
}
void *
t4 (void *argv)
{
char c = '4';
unsigned int p[4];
memcpy (p, (void *) argv, 4 * sizeof (unsigned int));
FILE *fd;
int i;
for (i=0;i<1000000000;i++)
{
if (flag41 == 1)
{
pthread_mutex_lock (&mutexD);
fd = (FILE *) p[3];
fwrite (&c, 1, 1, fd);
flag41 = 0;
flag12=1;
pthread_mutex_unlock (&mutexD);
}
if (flag42 == 1)
{
pthread_mutex_lock (&mutexC);
fd = (FILE *) p[2];
fwrite (&c, 1, 1, fd);
flag42 = 0;
flag13=1;
pthread_mutex_unlock (&mutexC);
}
if (flag43 == 1)
{
pthread_mutex_lock (&mutexB);
fd = (FILE *) p[1];
fwrite (&c, 1, 1, fd);
flag43 = 0;
flag14=1;
pthread_mutex_unlock (&mutexB);
}
if (flag44 == 1)
{
pthread_mutex_lock (&mutexA);
fd = (FILE *) p[0];
fwrite (&c, 1, 1, fd);
flag44 = 0;
flag11=1;
pthread_mutex_unlock (&mutexA);
}
}
}
main ()
{
pthread_t t_id1, t_id2, t_id3, t_id4;
fd1 = fopen ("A", "a");
fd2 = fopen ("B", "a");
fd3 = fopen ("C", "a");
fd4 = fopen ("D", "a");
signal(2,(sighandler_t)sig_handler);
unsigned int p[4];
p[0] = (unsigned int) fd1;
p[1] = (unsigned int) fd2;
p[2] = (unsigned int) fd3;
p[3] = (unsigned int) fd4;
pthread_create (&t_id1, NULL, &t1, p);
pthread_create (&t_id2, NULL, &t2, p);
pthread_create (&t_id3, NULL, &t3, p);
pthread_create (&t_id4, NULL, &t4, p);
pthread_join (t_id1, NULL);
pthread_join (t_id2, NULL);
pthread_join (t_id3, NULL);
pthread_join (t_id4, NULL);
fclose (fd1);
fclose (fd2);
fclose (fd3);
fclose (fd4);
}