Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 19 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
19
Dung lượng
902,67 KB
Nội dung
1 TRƯỜNG ĐẠI HỌC TÔN ĐỨC THẮNG KHOA CÔNG NGHỆ THÔNG TIN BÁO CÁO BÀI TẬP NMHĐH HK2, 2021-2022 Lab Nhóm: 02 Tổ: 01 Thành Viên Nhóm: (SV tự chọn nhóm, tối đa SV) 1: Nguyễn Quốc Anh (MSSV: 52100871) 2: Cao Hoàng Anh (MSSV: 52100917) 3: Lục Minh Hiếu (MSSV: 52100889) 0 Mục lục A PHẦN THỰC HÀNH Ví Dụ 1: Ví dụ 2: Ví dụ 3: Ví dụ 4: tổng hợp ví dụ nêu B PHẦN BÀI TẬP BÀI 1: BÀI 2: BÀI 3: BÀI 4: 11 BÀI 5: 13 BÀI 6: 14 KẾT LUẬN 18 KẾT QUẢ LÀM VIỆC CÁC THÀNH VIÊN TRONG NHÓM 19 0 A PHẦN THỰC HÀNH Ví Dụ 1: Hãy biên dịch, chạy thử, bỏ hàm sleep() dòng 17, tăng giá trị đối số sleep() giải thích kết chạy cho tình A: Code Chương Trình #include #include void* thr1(void* ar){ printf("This is thread %d\n",*((int*) ar)); sleep(2); } int main(int argc, char* argv[]){ int i; int num=atoi(argv[1]); pthread_t tid[num]; for(i = 0; i < num; i++){ pthread_create(&tid[i], NULL, thr1, (void*) &tid[i]); } sleep(3); return(0); } B: Kết Quả Demo Giải thích: Hàm sleep() sử dụng để dừng thực thi luồng số giây truyền vào Ở sử dụng sleep(3) sau 3s kết thúc, tang số giây lên kết thúc lâu Ví dụ 2: A: Code Chương Trình #include #include #include #include #include struct arr{ int n; int a[10]; }; void* thr1(void* ar){ 0 int count; struct arr *ap=(struct arr*) ar; for(count=0;countn; count++) { printf("%d\t",ap->a[count]); } printf("\n"); } int main(int argc, char* argv[]){ struct arr ar; ar.n=5; int i; for(i=0;ia[i] = i+1; } } void* thr2(void* ar){ struct arr *ap = (struct arr*) ar; int i, s=0; for(i=0;in;i++) { s=s + ap->a[i]; } sum=s; } void* thr3 (void* ar){ struct file *fi = (struct file*) ar; FILE *out; int count; out = fopen(fi->filename,"wb"); 0 fprintf(out,"number element or array: %d\n", fi->ar.n); for(count=0; countar.n; count++){ fprintf(out,"%d\t",fi->ar.a[count]); } fprintf(out,"\n"); fprintf(out,"sum=%d\n",sum); printf("tong : %d\n",sum); fclose(out); } int main (int argc,char * argv[]){ int i; pthread_t tid[3]; struct arr ar; int status, *pstatus= &status; pthread_create(&tid[0],NULL,thr1,(void*) &ar); sleep(1); if(pthread_join(tid[0],(void**) pstatus)==0) { pthread_create(&tid[1],NULL,thr2,(void*) &ar); if(pthread_join(tid[1], NULL)==0) { struct file arf; arf.ar=ar; arf.filename=argv[1]; pthread_create(&tid[2],NULL,thr3,(void*) &arf); } } sleep(2); return 0; } B: Kết Quả Demo: 0 B PHẦN BÀI TẬP BÀI 1: Viết chương trình đa luồng tính tốn giá trị thống kê khác từ danh sách số truyền vào thông qua đối số dịng lệnh Chương trình sau tạo ba tiểu trình tính tốn riêng biệt Một tiểu trình xác định trung bình cộng số, tiểu trình thứ hai xác định giá trị lớn tiểu trình thứ ba xác định giá trị nhỏ A: Code Chương Trình: #include #include #include #include #include struct arr{ int n; int a[10]; }; static int average = 0; static int max = 0; static int = 0; void* thr1(void* ar){ struct arr *ap = (struct arr*) ar; // Ép kiểu arr int i=0, average_temp = 0; for(i=0;in;i++) { average_temp = average_temp + ap->a[i] ; } average_temp = average_temp / ap->n; average = average_temp; } void* thr2(void* ar){ struct arr *ap = (struct arr*) ar; // Ép kiểu arr int i, max_temp; max_temp = ap->a[0]; for(i=1;in;i++) { if (max_temp < ap->a[i]) { max_temp = ap->a[i]; } } max = max_temp; } void* thr3 (void* ar){ struct arr *ap = (struct arr*) ar; // Ép kiểu arr int i, min_temp; min_temp = ap->a[0]; for(i=1;in;i++) { if (min_temp > ap->a[i]) { min_temp = ap->a[i]; } } = min_temp; } int main (int argc,char * argv[]){ 0 int i; pthread_t tid[3]; // Tạo thread id struct arr ar; // Tạo ar với struct arr ar.n = argc - 1; for (i=1;ia[0]; for(i=1;in;i++) { if (max_temp < ap->a[i]) { max_temp = ap->a[i]; } } max = max_temp; } void* thr3 (void* ar){ struct arr *ap = (struct arr*) ar; //Ép kiểu int i, min_temp; min_temp = ap->a[0]; for(i=1;in;i++) { if (min_temp > ap->a[i]) { min_temp = ap->a[i]; } } = min_temp; } void* thr4 (void* ar) { FILE *out; out = fopen("result.txt","wb"); fprintf(out, "Gia tri trung binh: %d\n", average); fprintf(out, "Gia tri lon nhat: %d\n", max); fprintf(out, "Gia tri nho nhat: %d\n", min); fclose(out); } int main (int argc,char * argv[]){ 0 11 int i; pthread_t tid[4]; struct arr ar; ar.n = argc - 1; for (i=1;isource_file,"r"); FILE *fo; fo = fopen(ap->target_file,"wb"); int dem=0; char c; while(c != EOF) { c = fgetc(fi); // get char từ file input if (c != EOF) { fputc(c, fo); // put char qua file output } dem++; // Đếm ký tự } all_char = dem; } int main (int argc,char * argv[]){ pthread_t tid; struct file f; f.source_file = argv[1]; f.target_file = argv[2]; pthread_create(&tid, NULL, thr1, (void*) &f); // tạo thr1 pthread_join(tid, NULL); // Đợi thr1 printf("Da chep cong %ld ki tu.\n", all_char); return 0; } B: Kết Quả Demo: 0 13 BÀI 5: Viết chương trình tạo thread thực công việc sau: ● Thread thứ nhận đối số truyền từ môi trường (argv[1]), kiểm tra số lớn 0, tính giai thừa số (có thể sử dụng struct biến tồn cục) ● Thread thứ hai chờ thread thứ hoàn tất, thực việc tính tổng số chẳn từ nhỏ kết giai thừa thread thứ tính ● Thread thứ ba chờ thread thứ hoàn tất, ghi kết vào file đối số thứ từ biến môi trường (argv[2]) Nội dung ghi vào gồm: dòng thứ lưu giá trị argv[1]; dòng thứ lưu kết giai thừa; dòng thứ lưu tổng số chẵn nhỏ giai thừa A: Code Chương Trình: #include #include #include #include #include static long factorial = 1; static int sum_even = 0; static int n = 0; void* thr1(void* ar){ int i; long factorial_temp = 1; for (i = 1; i