将互斥机制代码重新实现一遍
将同步机制代码重新实现一遍
使用三个线程完成两个文件的拷贝,线程1完成拷贝前一半,线程2完成拷贝后一半,主线程回收两个分支线程的资源
1 #include
2 sem_t sem;
3 struct Info
4 {
5 int srcfd;
6 int dstfd;
7 int size;
8 };
9 //定义分支线程函数体
10 void *task1(void *buf)
11 {
12 //不断得将源文件中的内容读出,并写入的目标文件中
13 //直到源文件读取一半结束
14 char buf1[1] = "";
15 int count=0;
16 lseek(((struct Info*)buf)->srcfd,0,SEEK_SET);
17 while(1)
18 {
19 memset(buf1, 0, sizeof(buf1)); //将容器清空
20 int res = read(((struct Info*)buf)->srcfd, buf1, sizeof(buf1)); //从源文件中读取数据
21 count+=res;
22 //对读取的数据个数进行判断
23 if(count>((struct Info*)buf)->size/2)
24 {
25 break;
26 }
27 write(((struct Info*)buf)->dstfd, buf1, res); //将数据写入目标文件
28 }sem_post(&sem);
29 pthread_exit(NULL);
30 }
31 void *task2(void *buf)
32 {
33 sem_wait(&sem);
34 lseek(((struct Info*)buf)->srcfd,(((struct Info *)buf)->size)/2,SEEK_SET);
35 //不断得将源文件中的内容读出,并写入的目标文件中
36 //直到源文件读取后一半结束
37 char buf2[128] = "";
38 while(1)
39 {
40 memset(buf2, 0, sizeof(buf2)); //将容器清空
41 int res = read(((struct Info *)buf)->srcfd, buf2, sizeof(buf2)); //从源文件中读取数据
42 //对读取的数据个数进行判断
43 if(res==0)
44 {
45 break;
46 }
47 write(((struct Info*)buf)->dstfd, buf2, res); //将数据写入目标文件
48 }
49 pthread_exit(NULL);
50 }
51 int main(int argc, const char *argv[])
52 {
53 //判断传入的文件个数
54 if(argc != 3)
55 {
56 printf("input file error\n");
57 printf("usage:./a.out srcfile dstfile\n");
58 return -1;
59 }
60 //定义文件描述符变量
61 int srcfd, dstfd;
62 //以只读的形式打开源文件
63 if((srcfd = open(argv[1], O_RDONLY)) ==-1)
64 {
65 perror("open srcfile error");
66 return -1;
67 }
68 //以只写的形式打开目标文件
69 if((dstfd = open(argv[2], O_WRONLY|O_CREAT|O_TRUNC, 0664)) ==-1)
70 {
71 perror("open dstfile error");
72 return -1;
73 }
74 sem_init(&sem, 0, 0);
75 unsigned int size;
76 size = lseek(srcfd, 0, SEEK_END);
77 struct Info buf = {srcfd, dstfd, size};
78 //定义一个线程号变量
79 pthread_t tid1,tid2;
80 //创建出一个分支线程
81 if(pthread_create(&tid1, NULL, task1, &buf) != 0)
82 {
83 printf("tid create error\n");
84 return -1;
85 }
86 if(pthread_create(&tid2, NULL, task2, &buf) != 0)
87 {
88 printf("tid create error\n");
89 return -1;
90 }
91 pthread_join(tid1, NULL);
92 pthread_join(tid2, NULL);
93 sem_destroy(&sem);
94 close(srcfd);
95 close(dstfd);
96 return 0;
97 }
使用三个线程完成:线程1输出字符'A',线程2输出字符'B',线程3输出字符'C',要求输出结果为:ABCABCABCABCABC...
1 #include
2 //1、创建一个无名信号量
3 sem_t sem;
4 //定义一个标志控制线程顺序
5 int flag=0;
6 void *task1(void *arg)
7 {
8 while(1)
9 {
10 if(flag==0)
11 {
12 printf("A");
13 flag=1;
14 }
15 //4、释放资源
16 sem_post(&sem);
17 }
18 }
19 void *task2(void *arg)
20 {
21 while(1)
22 {
23 //3、申请资源,如果没有资源,则在该处阻塞
24 sem_wait(&sem);
25 if(flag==1)
26 {
27 printf("B");
28 flag=2;
29 }
30 //4、释放资源
31 sem_post(&sem);
32 }
33 }
34 void *task3(void *arg)
35 {
36 while(1)
37 {
38 //3、申请资源,如果没有资源,则在该处阻塞
39 sem_wait(&sem);
40 if(flag==2)
41 {
42 printf("C");
43 flag=0;
44 }
45 }
46 }
47 int main(int argc, const char *argv[])
48 {
49 //创建三个线程
50 pthread_t tid1,tid2,tid3;
51 //2、初始化无名信号量
52 sem_init(&sem, 0, 0);
53 //创建A线程
54 if(pthread_create(&tid1, NULL, task1, NULL) != 0)
55 {
56 printf("tid1 create error\n");
57 return -1;
58 }
59 //创建B线程
60 if(pthread_create(&tid2, NULL, task2, NULL) != 0)
61 {
62 printf("tid2 create error\n");
63 return -1;
64 }
65 //创建C线程
66 if(pthread_create(&tid3, NULL, task3, NULL) != 0)
67 {
68 printf("tid2 create error\n");
69 return -1;
70 }
71 //主线程回收资源
72 pthread_join(tid1, NULL);
73 pthread_join(tid2, NULL);
74 pthread_join(tid3, NULL);
75 //5、销毁无名信号量
76 sem_destroy(&sem);
77 return 0;
78 }