Lab 1 Posix Threads Programming 1 Mục tiêu - SV tìm hiểu và sử dụng thư viện Posix Thread trên linux - Viết một chương trình multithread đơn giản minh họa tính hiệu quả của chương trìn
Trang 1Lab 1 Posix Threads Programming
1 Mục tiêu
- SV tìm hiểu và sử dụng thư viện Posix Thread trên linux
- Viết một chương trình multithread đơn giản minh họa tính hiệu quả của chương trình khi được song song hóa
- Các hàm Posix threads cơ bản:
o pthread_create(), pthread_attr_init(), pthread_attr_destroy(), pthread_exit()
o pthread_join(), pthread_detach(), pthread_attr_getdetachsate(), pthread_attr_setdetachstate()
o Pthread_mutex_init(), pthread_mutex_destroy(), pthread_mutexattr_init() , pthread_mutexattr_destroy(), pthread_mutex_lock(), pthread_mutex_unlock()
2 Nội dung
2.1 Yêu cầu
SV viết một chương trình multithread thực thi đồng thời 3 giải thuật sắp xếp sau: Selection sort, Interchange sort, Bubble sort Thứ tự tạo thread thực thi mỗi giải thuật là tùy ý, SV thay đổi kích thướt dữ liệu đầu vào và quan sát kết quả của chương trình Nhận xét về kết quả chương trình trong các lần thay đổi kích thướt dữ liệu
2.2 Hướng dẫn
Chương trình mẫu cung cấp chỉ mang tính tham khảo, SV có thể tự viết chương trình hoặc bổ sung, thay đổi bài mẫu để hoàn tất yêu cầu của bài lab
Chương trình mẫu được cung cấp dưới đây hiện thực 3 giải thuật sắp xếp đã yêu cầu, SV cần tìm hiểu các hàm Posix threads để hoàn tất hàm main() trong chương trình
/* Ma nguon */
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define NUM_THREADS 3
struct threadData {
int tid;
long num;
long *a;
};
struct threadData arrayData[NUM_THREADS];
SinhVienZone.Com
Trang 2void Swap(long *x, long *y){
long temp;
temp = *x;
*x = *y;
*y = temp;
}
/* selection Sort */
void *selectionSort(void* data){
long i,j,temp,min;
/* Thread Argument Passing */
struct threadData *myData;
myData = (struct threadData *)data;
int myid = myData->tid;
long myNum = myData->num;
long *myArray = myData->a;
printf("\n Thread %d starts Selection Sort: \n",myid);
/* Processing */
for(i=0; i < myNum-1; i++)
{
if(myArray[min] > myArray[j])
min = j;
}
Swap(&myArray[min],&myArray[i]);
}
printf("\n Result selection sort from thread %d : \n",myid); for(i=0; i < myNum; i++)
printf("%5ld ", myArray[i]);
pthread_exit(NULL);
}
/* interchange sort */
void *interchangeSort(void* data){
long i,j;
/* Thread Argument Passing */
struct threadData *myData;
myData = (struct threadData *)data;
int myid = myData->tid;
long myNum = myData->num;
long *myArray = myData->a;
printf("\n Thread %d starts Interchange Sort: \n",myid);
/* Processing */
for(i=0; i < myNum-1; i++)
{
if(myArray[i] > myArray[j])
Swap(&myArray[j],&myArray[i]);
}
printf("\n Result interchange sort from thread %d : \n",myid);
SinhVienZone.Com
Trang 3for(i=0; i < myNum; i++)
printf("%5ld ", myArray[i]);
pthread_exit(NULL);
}
/* bubble sort */
void *bubbleSort(void* data){
long i,j;
/* Thread Argument Passing */
struct threadData *myData;
myData = (struct threadData *)data;
int myid = myData->tid;
long myNum = myData->num;
long *myArray = myData->a;
printf("\n Thread %d starts Bubble Sort: \n",myid);
/* Processing */
for(i=0; i < myNum-1; i++)
{
if(myArray[j] < myArray[j-1])
Swap(&myArray[j],&myArray[j-1]);
}
printf("\n Result bubble sort from thread %d : \n",myid); for(i=0; i < myNum; i++)
printf("%5ld ", myArray[i]);
pthread_exit(NULL);
}
int main(int argc, char **argv){
pthread_t threads[NUM_THREADS];
int status,rc;
long i,j,n,ret;
/* Initialize Data */
long **a;
(*a) = (long *)malloc(NUM_THREADS * sizeof(long));
for(i=0; i < NUM_THREADS; i++)
a[i] = (long *)malloc(N * sizeof(long));
for(j=0; j < N; j++)
a[0][j] = random()%1000;
/* replicate to all rows */
for(i=1; i < NUM_THREADS; i++)
{
for(j=0; j < N; j++)
a[i][j] = a[0][j];
}
/* Mornitoring data */
printf("\n Data before sorting: \n");
for(j=0; j < N; j++){
SinhVienZone.Com
Trang 4printf("%5ld ", a[0][j]);
}
printf("\n \n");
for(j=0; j < N; j++){
printf("%5ld ", a[1][j]);
}
for(i=0; i < NUM_THREADS; i++){
printf("\n Creating thread %d: \n",i);
arrayData[i].tid = i;
arrayData[i].num = N;
arrayData[i].a = a[i];
}
/* SV tạo thread thực thi các giải thuật */
/* SV gọi hàm chờ các thread kết thúc */
pthread_exit(NULL);
return 0;
}
/* Ket thuc */
SV nhận xét về kết quả thử nghiệm chương trình !
3 Bài tập
SV sử dụng kiến thức về lập trình multithread viết các chương trình sau:
3.1 Viết chương trình nhân hai vector
3.2 Viết chương trình nhân hai ma trận
Hướng dẫn: SV sử dụng hàm pthread_mutex_lock() và pthread_mutex_unlock() trong trường hợp đồng bộ dữ liệu dùng chung giữa các thread
3.3 Viết chương trình chơi cờ caro trên bàn cờ N*N Đề xuất mô hình multithread cho giải thuật tìm kiếm nước đi tốt nhất và khảo sát tính hiệu quả, thời gian chạy của giải thuật được song song hóa bằng multithread
3.4 Viết chương trình đặt N quân hậu vào bàn cờ tổng quát N *N ô Đề xuất mô hình multithread cho giải thuật đặt hậu và khảo sát tính hiệu quả, thời gian chạy của giải thuật được song song hóa bằng multithread
SinhVienZone.Com