Threading Programming
แสดงตัวอย่างการสร้าง thread อย่างง่ายโดยการเรียกใช้ฟังก์ชัน pthread_create()
// thread1.c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
void* print_message_function(void *ptr) {
char *message;
message = (char*) ptr;
printf("[Thread started] %s \n", message);
}
main() {
pthread_t thread;
const char *message = "Hello World...";
int iret;
iret = pthread_create(&thread, NULL, print_message_function,
(void*) message);
/* Wait till thread is complete before main continues. Unless we */
/* wait we run the risk of executing an exit which will terminate */
/* the process and thread before the thread has completed. */
pthread_join(thread, NULL);
printf("Thread returns: %d\n", iret);
exit(0);
}ทำการคอมไพล์ และทดสอบรันโปรแกรม
แสดงตัวอย่างการสร้าง thread ขึ้นมา 4 ตัวจากฟังก์ชัน *printme(void *ip) เดียวกัน โดยแต่ละ thread ก็จะแสดงข้อความเพียงแจ้งว่าตัวเองเป็น thread ตัวที่เท่าไหร่ (0-3) ซึ่งถ้าโปรแกรมทำงานอยู่บนเครื่องคอมพิวเตอร์ที่มีหน่วยประมวลผลเป็นแบบหลายตัว (multiprocessors) ก็จะทำให้ประสิทธิภาพการทำงานในการประมวลผลรวดเร็วยิ่งขึ้น เพราะแต่ละตัวจะแยกใช้งานไปแต่ละตัวหน่วยประมวลผล
ทำการคอมไพล์ และทดสอบรันโปรแกรม
จากผลลัพธ์จะสังเกตเห็นว่าเมื่อเริ่มเรียกฟังก์ชัน pthread_join() ดังนั้นตัว thread ตัวที่ 1 (อาจจะไม่ได้เรียงตามลำดับหมายเลขทุกครั้งไป เนื่องจากขึ้นอยู่กับว่าตัว thread ใดเข้าครอบครองหน่วยประมวลผลเป็นคนแรก) ก็จะเริ่มเข้าใช้งานหน่วยประมวลผล แล้วแสดงข้อความว่า “Hi. I'm thread x” เมื่อการทำงานเสร็จสิ้น ก็จะเป็นคิวของตัว thread ถัดๆไปจนครบทั้ง 4 ตัว ก็จะกลับมายังฟังก์ชันหลัก (main) เพื่อสิ้นสุดการทำงานของโปรแกรม
แสดงตัวอย่างการส่งผ่านข้อความ (char *) ให้กับเทรด ซึ่งตัวอย่างก่อนหน้านี้เป็นการส่งข้อมูลที่เป็นตัวแปรจำนวนเต็มทั่วไป
ทำการคอมไพล์ และทดสอบรันโปรแกรม
แสดงตัวอย่างการใช้ pthread_exit() เพื่อทำให้ thread สิ้นสุดการทำงาน แต่จะยังคงรักษาให้งาน (task) ยังทำงานอยู่ ถ้า thread ทั้งหมดสิ้นสุดลงแล้วงาน (task) ก็จะสิ้นสุดลงเช่นกัน
ทำการคอมไพล์ และทดสอบรันโปรแกรม
ผลลัพธ์จากการรันโปรแกรม thread4 จะได้ผลเช่นเดียวกับโปรแกรม thread2 จากตัวอย่างที่ 2
แสดงตัวอย่างการเรียก exit() ในฟังก์ชันของ thread แทนที่จะเรียก pthread_exit()
ทำการคอมไพล์ และทดสอบรันโปรแกรม
ผลลัพธ์จากการรันโปรแกรม thread5 จะสังเกตเห็นว่ามีการเรียกฟังก์ชัน exit() ภายในฟังก์ชัน thread ทำให้เมื่อมี thread ตัวใดตัวหนึ่งเริ่มเข้าครอบครองหน่วยประมวลผลกลาง เมื่อทำงานเสร็จ (แสดงข้อความ) ก็จะเรียก exit() เป็นผลให้สิ้นสุดการทำงานของโปรแกรมหลัก รวมทั้ง thread ลูกต่างๆทันที
แสดงตัวอย่างการทำงานระหว่าง 2 เทรด ที่พยายามแย่งกันแสดงผลข้อความออกทางหน้าจอ
ทำการคอมไพล์ และทดสอบรันโปรแกรม
จากผลลัพธ์คำสั่งข้างต้นจะสังเกตเห็นข้อความทั้งสองที่เกิดจากแต่ละเทรดจะแสดงแทรกกันไปมาไม่มีรูปแบบแน่นอน ขึ้นอยู่กับว่าเทรดตัวใด เข้าครอบครองหน่วยประมวลผลก่อนกัน
แสดงตัวอย่างการแก้ปัญหาลำดับการแสดงผล โดยให้เทรดแรกได้เข้าถึงทรัพยากรกลางก่อน แล้วให้อีกเทรดถึงไปอ่านค่าในทรัพยากรกลางเป็นลำดับถัดไป ดังตัวอย่างข้างล่างนี้
ทำการคอมไพล์ และทดสอบรันโปรแกรม
จากผลลัพธ์คำสั่งข้างต้น เมื่อมีการใช้การจัดการจังหวะการทำงานเพื่อควบคุมให้แต่เทรดทำงานเป็นลำดับ ก็จะทำให้ผลการทำงานออกถูกต้อง กล่าวคือเมื่อเทรด thread_read() ทำการอ่านค่าจากผู้ใช้แล้วนำไปเก็บในตัวแปร msg โดยที่เทรดอีกตัว thread_write() จะต้องรอให้ตัวแรกทำการเก็บค่าให้เสร็จเรียบร้อยเสียก่อน ถึงจะสามารถเข้าไปอ่านค่าในตัวแปร msg เพื่อมาแสดงผลได้
แสดงการประยุกต์การสื่อสารผ่านระบบเครือข่ายด้วยวิธีการ socket programming โดยให้เครื่องแม่ข่ายที่เปิดพอร์ตรอ สามารถรองรับการเชื่อมต่อจากตัวลูกข่ายได้หลายเครื่องพร้อมกัน โดยการใช้ pthread ดังตัวอย่างส่วนของเครื่องแม่ข่ายข้างล่าง
สำหรับโปรแกรมลูกข่ายดังแสดงข้างล่างนี้
คอมไพล์และรันโปรแกรมทั้งสองดังนี้
Last updated
Was this helpful?