นี่คือวิธีทำการบวกและลบเมทริกซ์ในสภาพแวดล้อมมัลติเธรด pthread ใช้รันหลายเธรดพร้อมกันใน C หรือ C++
มีเมทริกซ์สองอัน A และ B อันดับของแต่ละเมทริกซ์คือ (m x n) แต่ละเธรดจะรับแต่ละแถว และทำการบวกหรือลบ ดังนั้นสำหรับ m แถว จะมี m เธรดที่ต่างกัน
ตัวอย่างโค้ด C++
#include#include #include #include #define CORE 3 #define MAX 3 using namespace std; int AMat[MAX][MAX] = {{10, 20, 30}, {40, 50, 60}, {70, 80, 50} }; int BMat[MAX][MAX] = {{80, 60, 20}, {30, 20, 15}, {10, 14, 35} }; pthread_t thread[CORE * 2]; int add[MAX][MAX], sub[MAX][MAX]; void* addMatrices(void* arg) { intptr_t core = (intptr_t)arg; // แต่ละเธรดคำนวณ 1/3 ของการบวกเมทริกซ์ for (int i = core * MAX / 3; i < (core + 1) * MAX / 3; i++) { for (int j = 0; j < MAX; j++) { add[i][j] = AMat[i][j] + BMat[i][j]; } } } void* subtraction(void* arg) { intptr_t core = (intptr_t)arg; // แต่ละเธรดคำนวณ 1/3 ของการลบเมทริกซ์ for (int i = core * MAX / 3; i < (core + 1) * MAX / 3; i++) { for (int j = 0; j < MAX; j++) { sub[i][j] = AMat[i][j] - BMat[i][j]; } } } void display(){ cout << "Matrix A: " << endl; for(int i = 0; i < MAX; i++) { for(int j = 0; j < MAX; j++) { cout << AMat[i][j] << " "; } cout << endl; } cout << "\nMatrix B: " << endl; for(int i = 0; i < MAX; i++) { for(int j = 0; j < MAX; j++) { cout << BMat[i][j] << " "; } cout << endl; } } void displayRes(){ cout << "\nAddition: " << endl; for(int i = 0; i < MAX; i++) { for(int j = 0; j < MAX; j++) { cout << add[i][j] << " "; } cout << endl; } cout << "\nSubtraction: " << endl; for(int i = 0; i < MAX; i++) { for(int j = 0; j < MAX; j++) { cout << sub[i][j] << " "; } cout << endl; } } main() { display(); int step = 0; for (int i = 0; i < CORE; i++) { pthread_create(&thread[i], NULL, &addMatrices, (void*)step); pthread_create(&thread[i + CORE], NULL, &subtraction, (void*)step); step++; } for (int i = 0; i < CORE * 2; i++) { pthread_join(thread[i], NULL); } displayRes(); }
ผลลัพธ์
Matrix A: 10 20 30 40 50 60 70 80 50 Matrix B: 80 60 20 30 20 15 10 14 35 Addition: 90 80 50 70 70 75 80 94 85 Subtraction: -70 -40 10 10 30 45 60 66 15