Viết chương trình đa luồng để xuất ra số nguyên tố.. Người dùng chạy chương trình và nhập vào một số nguyên thông qua đối số tại dòng lệnh.. Chương trình sau đó sẽ tạo ra một tiến trình
Trang 1TRƯỜ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 4 Thành Viên: Nguyễn Ngô Đăng Khoa (521H0084)
Mục lục
A PHẦN THỰC HÀNH 3
Ví Dụ 1: Biên dịch và chạy thử nếu bỏ sleep(1) thì như thế nào ? 3
Ví Dụ 2: 4
Ví Dụ 3: 5
Ví Dụ 3: 6
B PHẦN BÀI TẬP 9
1 Viết chương trình đa luồng tính toán các giá trị thống kê khác nhau từ một danh sách các số được truyền vào thông qua đối số của dòng lệnh Chương trình sau đó sẽ tạo ba tiểu trình tính toán riêng biệt Một tiểu trình sẽ xác định trung bình cộng của các số, tiểu trình thứ hai sẽ xác định giá trị lớn nhất và tiểu trình thứ ba sẽ xác định giá trị nhỏ nhất 9
2 Viết chương trình đa luồng để xuất ra số nguyên tố Người dùng chạy chương trình và nhập vào một số nguyên thông qua đối số tại dòng lệnh Chương trình sau đó sẽ tạo ra một tiến trình riêng biệt xuất ra tất cả các số nguyên tố nhỏ hơn hoặc bằng số được nhập bởi người dùng 12
Trang 23 Chỉnh sửa lại bài 1 sao cho thay vì xuất kết quả ra màn hình thì kết quả sẽ được ghi vào tập tin result.txt ở cùng thư mục với chương trình chạy 15
4 Viết chương trình để sao chép dữ liệu từ file nguồn vào file đích Với tên file nguồn và file đích là đối số đầu vào Đếm số kí tự đã sao chép Giả sử chương trình chỉ chạy trên tập tin text 17 KẾT LUẬN 20
Trang 3A PHẦN THỰC HÀNH
Ví Dụ 1: Biên dịch và chạy thử nếu bỏ sleep(1) thì như thế nào ?
A: Code Chương Trình
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h> // atoi
#include <unistd.h> // sleep
void*thr1(void*ar)
{
printf("This is thread %d\n", * int*(( ) ar));
sleep( );2
}
intmain( intargc, char*argv[])
{
i;int
num int = atoi(argv[1]);
pthread_t tid[num];
for =(i ; i num; i0 < ++)
pthread_create(&tid[i], NULL thr1, , (void* &tid[i]);) sleep( );1 N u b dòng này ch ng trình s không hi n khi
run
return ;0
}
B: Kết Quả Demo
Trang 4Ví Dụ 2:
A: Code Chương trình
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
struct arr
{
n;int
a[int 10];
};
void*thr1(void*ar)
{
count;int
structarr * =ap (struct arr*) ;ar
for(count=0; count ap n; count< -> ++) printf("%d\t",ap a[count]);->
printf("\n");
}
Trang 5intmain( intargc, char*argv[])
{
structarr ar;
ar.n ;=5
i;int
for =(i 0;i ar.n;i++)
ar.a[i]=i+1;
pthread_t tid;
pthread_create( tid,& NULL thr1,& , ar);& sleep( );2
return ;0
}
B: Kết Quả Demo
Ví Dụ 3:
A: Code Chương trình
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
void*thr1(void*ar)
{
count;int
printf("This is thread %d\n",* int*(( ) ));ar
sleep( );2
}
intmain ( intargc, char*argv[])
{
i;int
Trang 6pthread_t tid[3];
status, pstatus int * = &status;
for =(i 0;i 3;i++)
pthread_create( tid[i],& NULL thr1, ,(void* &tid[i]);) for =(i 0;i 3;i++)
{
if(pthread_join(tid[i],(void**) pstatus) )>0
printf("pthread_join for thread %d failure\n", (int)tid[i]);
printf("pthread_waited of %d OK, return code: %d\n", (int)tid[i], status);
sleep( );1
}
sleep( );1
return ;0
}
B: Kết Quả Demo
Ví Dụ 3:
A: Code Chương trình
Trang 7#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
struct arr
{
n;int
a[int 10];
};
struct file
{
structarr ar;
char* filename;
};
static int sum =0;
void*thr1(void*ar)
{
structarr *ap (= structarr*) ;ar
ap->n=3; i ;int =0
for =(i 0;i ap n;i-> ++)
ap a[i] i ;-> = +1
}
void*thr2(void*ar)
{
structarr *ap (= structarr*) ;ar
i, s ;int =0
for =(i 0;i ap n;i-> ++)
s s ap= + ->a[i];
sum=s;
}
void*thr3 (void*ar)
{
structfile * = structfi ( file*) ;ar
FILE *out; count;int
out= fopen(fi filename,-> "wb");
Trang 8fprintf(out,"number element or array: %d\n", fi->ar.n); for(count=0; count< ->fi ar.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);
}
intmain ( intargc,char * argv[])
{
i;int
pthread_t tid[3];
structarr ar;
status, int *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_create(&tid[ ],1 NULL thr2, , (void* &ar)) ==0) {
structfile arf;
arf.ar=ar;
arf.filename=argv[ ];1
pthread_create( tid[ ],& 2 NULL thr3, ,(void* &arf);) }
}
sleep( );2
return ;0
}
Trang 9B: Kết Quả Demo
B PHẦN BÀI TẬP
1 Viết chương trình đa luồng tính toán các giá trị thống kê khác nhau từ một
danh sách các số được truyền vào thông qua đối số của dòng lệnh Chương trình sau đó sẽ tạo ba tiểu trình tính toán riêng biệt Một tiểu trình sẽ xác định trung bình cộng của các số, tiểu trình thứ hai sẽ xác định giá trị lớn nhất và tiểu trình thứ ba sẽ xác định giá trị nhỏ nhất
A Code chương trình:
#include <pthread.h>
#include <stdlib.h>
#include <stdio.h>
typedef struct data{
int* arr;
n_arr;int
} data;
void*average(void*p){
data ptr (data ) p;* = *
// Declare sum dynamically to return to join:
float* avr (= float*) calloc(1, sizeof float( ));
avr[ ] ;0 =0
size ptr n_arr ;int = ->
for(int = i 0; i size; i< ++){
avr[ ] avr[ ] ptr0 = 0 + ->arr[i];
Trang 10}
avr[ ] avr[0 = 0]*1.0/(size);
pthread_exit(avr);
}
void*max(void*p){
data ptr (data ) p;* = *
// Declare sum dynamically to return to join: int* max (= int*) calloc(1, sizeof int( )); max[ ] ;0 =0
size ptr n_arr ;int = ->
for(int = i 0; i size; i< ++){
if(max[0] ptr< ->arr[i])
max[ ] ptr0 = ->arr[i];
};
pthread_exit(max);
}
void*min(void*p){
data ptr (data ) p;* = *
//
int* min (= int*) calloc(1, sizeof int( )); min[ ] 0 =10000;
size ptr n_arr ;int = ->
for(int = i 0; i size; i< ++){
if(min[0] ptr> ->arr[i])
min[ ] ptr0 = ->arr[i];
};
pthread_exit(min);
}
Trang 11intmain( intargc, char*argv[]){
// T o m ng ch a các đ i s đã nh p
int* int_arr (= int*) calloc(argc, sizeof(int));
for(int = i 0; i argc; i< ++){
(i if != 0){
int_arr[i] = atoi(argv[i]);
}
}
size_a ;int =0
for(int = i 0; i argc ; i< -1 ++){
int_arr[i] int_arr[i= +1];
size_a size_a ;= +1
}
// Declare arguments for both threads:
data thread_data[3];
thread_data[ ].arr int_arr;0 =
thread_data[ ].n_arr size_a;0 =
thread_data[ ].arr int_arr;1 =
thread_data[ ].n_arr size_a;1 =
thread_data[ ].arr int_arr;2 =
thread_data[ ].n_arr size_a;2 =
// Declare thread IDs:
pthread_t tid[3];
// Start both threads:
pthread_create( tid[& 0 NULL], , average, &thread_data[ ]);0
pthread_create( tid[& 1 NULL], , max, &thread_data[ ]);1
pthread_create( tid[& 2 NULL], , min, &thread_data[ ]);1
// Declare space for sum:
float* avr;
int* max;
Trang 12int* min;
// Retrieve sum of threads:
pthread_join(tid[0], (void**)&avr);
pthread_join(tid[1], (void**)&max);
pthread_join(tid[2], (void**)&min);
printf("Gia tri trung binh: %.2f\n", *avr);
printf("Gia tri lon nhat: %i\n", *max);
printf("Gia tri nho nhat: %i\n", *min);
return ;0
}
B: Kết Quả Demo
2 Viết chương trình đa luồng để xuất ra số nguyên tố Người dùng chạy chương trình và nhập vào một số nguyên thông qua đối số tại dòng lệnh Chương trình sau đó sẽ tạo ra một tiến trình riêng biệt xuất ra tất cả các số nguyên tố nhỏ hơn hoặc bằng số được nhập bởi người dùng
A Code chương trình:
#include <pthread.h>
#include <stdlib.h>
#include <stdio.h>
typedef structdata{
int* arr;
Trang 13number;int
} data;
intisPrime( intn)
{
// Corner case
( if n<= )1
return ;0
// Check from 2 to n-1
for int = ( i 2; i ; i<n ++)
( i if n% == 0)
return ;0
return ;1
}
void*printPrime(void*p){
data* ptr (= data*) ;p
//
int* avr (= int*) calloc(1, sizeof int( ));
count ;int =0
size ptr number ;int = ->
for(int = i 0; i <= size; i++){
if(isPrime(i) == )1
printf("%d ",i);
}
pthread_exit(0);
}
intmain( intargc, char*argv[]){
// T o m ng m i và đ i đ i s đã nh p v ki u d li u s
Trang 14number int =atoi(argv[ ]);1
count ;int =0
for(int = i 0; i number; i< ++){
if(isPrime(i) == )1
count++;
}
int* int_arr (= int*) calloc(count, sizeof(int));
// Declare arguments for both threads: data thread_data[1];
thread_data[ ].arr int_arr;0 =
thread_data[ ].number number;0 =
// Declare thread IDs:
pthread_t tid[1];
// Start both threads:
pthread_create( tid[& 0], NULL printPrime, ,
&thread_data[ ]);0
// Declare space for sum:
float* avr;
int* max;
int* min;
// Retrieve sum of threads:
pthread_join(tid[0], NULL);
printf("\n");
return ;0
}
B: Kết Quả Demo
Trang 153 Chỉnh sửa lại bài 1 sao cho thay vì xuất kết quả ra màn hình thì kết quả sẽ được ghi vào tập tin result.txt ở cùng thư mục với chương trình chạy
A Code chương trình:
#include <pthread.h>
#include <stdlib.h>
#include <stdio.h>
typedef structdata{
int* arr;
number;int
} data;
intisPrime( intn)
{
// Corner case
( if n<= )1
return ;0
// Check from 2 to n-1
for int = ( i 2; i ; i<n ++)
( i if n% == 0)
return ;0
return ;1
}
void*printPrime(void*p){
data* ptr (= data*) ;p
Trang 16
//
int* avr (= int*) calloc(1, sizeof int( ));
count ;int =0
size ptr number ;int = ->
for(int = i 0; i <= size; i++){
if(isPrime(i) == )1
printf("%d ",i);
}
pthread_exit(0);
}
intmain( intargc, char*argv[]){
// T o m ng m i và đ i đ i s đã nh p v ki u d li u s
number int =atoi(argv[ ]);1
count ;int =0
for(int = i 0; i number; i< ++){
if(isPrime(i) == )1
count++;
}
int* int_arr (= int*) calloc(count, sizeof(int));
// Declare arguments for both threads:
data thread_data[1];
thread_data[ ].arr int_arr;0 =
thread_data[ ].number number;0 =
// Declare thread IDs:
pthread_t tid[1];
// Start both threads:
pthread_create( tid[& 0], NULL printPrime, ,
&thread_data[ ]);0
Trang 17// Declare space for sum:
float* avr;
int* max;
int* min;
// Retrieve sum of threads:
pthread_join(tid[0], NULL);
printf("\n");
return ;0
}
B: Kết Quả Demo
4 Viết chương trình để sao chép dữ liệu từ file nguồn vào file đích Với tên file nguồn và file đích là đối số đầu vào Đếm số kí
tự đã sao chép Giả sử chương trình chỉ chạy trên tập tin text
A Code chương trình:
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct data{
char* filename1 ;
char* filename2 ;
Trang 18} data;
void*countCharacters(void*p){
data ptr (data ) p;* = *
char* filename ptr= ->filename1;
FILE fp * = fopen(filename, "r");
int* count (= int*) calloc(1, sizeof(int)); count[ ] 0 = 0;
for char = ( c getc(fp); c EOF; c != =getc(fp)) count[ ] count[ ] ;0 = 0 +1
fclose(fp);
pthread_exit(count);
}
void*copyFile(void*p){
data ptr (data ) p;* = *
FILE fp1 * = fopen(ptr->filename1, " "r); FILE fp2 * = fopen(ptr->filename2, " "w);
printf("%s ",ptr filename1);->
char = c fgetc(fp1);
while (c EOF)!=
{
fputc(c, fp2);
c = fgetc(fp1);
}
fclose(fp1);
fclose(fp2);
pthread_exit(0);
}
Trang 19intmain( intargc, char*argv[]){
// Declare arguments for both threads:
data thread_data[1];
thread_data[ ].filename1 argv[0 = 1];
thread_data[ ].filename2 argv[0 = 2];
// Declare thread IDs:
pthread_t tid[2];
// Start both threads:
pthread_create( tid[& 0 NULL], , countCharacters,
&thread_data[ ]);0
pthread_create( tid[& 1 NULL], , copyFile, &thread_data[ ]);0
// Declare space for sum:
int* count ;=0
// Retrieve sum of threads:
pthread_join(tid[0], (void**)&count);
pthread_join(tid[1 NULL], );
printf("Da sao chep thanh cong %i ki tu \n",*count); return ;0
}
B: Kết Quả Demo
Trang 20KẾT LUẬN
Sau khi học và hoàn thành phần lab 2 em thu được kết sau:
- Hoàn thành tất cả phần thực hành
- Hoàn thành 4/6 bài tập