Processes and threads
תהליכים ותתי תהליכים תהליכים –כל תוכנית שרצה היא תהליך (process) –ניתן להתפצל מתהליך אחד למספר תהליכים, בעזרת הפקודה fork(). הרבה יותר יעיל מבחינת זיכרון מהרצת אותה תוכנית מספר פעמים. –לתהליכים אין זיכרון משותף. תתי תהליכים (threads): –ניתן לפתוח תתי תהליכים מתוך תהליך בעזרת ספריית pthread.h –עשרות פונקציות לתיאום וסינכרון בין תתי תהליכים. –לתתי תהליכים יש גישה לזיכרון משותף : כולם מעדכנים משתנים משותפים.
שכפול תהליך בעזרת fork #include int main() { int i, j=0, pid; pid = fork(); printf("pid is: %d\n", getpid()); j++; if (pid==0) printf("child: %d\n", j); else printf("parent: %d\n",j); }
output pid is: child: 1 pid is: parent: 1
יצירת תתי תהליכים #include int g; void *threadFunc(void *arg){/* The thread function. Like main(), but for a thread */ char *str; str=(char*) arg; for (int i = 0; i < 6; i++) printf("%s (g = %d)\n",str, g++); return NULL; } void main(void) { pthread_t pth; pthread_create(&pth,NULL,threadFunc,“I’m a thread..."); for (int i = 0; i < 10 ; ++I;}printf("main() is running...(g = %d)\n", g++); } NULL = default attributes for thread Thread identifier Thread function Argument to function
output I'm a thread... (g = 0) I'm a thread... (g = 1) main() is running...(g = 2) I'm a thread... (g = 3) I'm a thread... (g = 4) I'm a thread... (g = 5) main() is running...(g = 6) I'm a thread... (g = 7) main() is running...(g = 8) main() is running...(g = 9) main() is running...(g = 10) main() is running...(g = 11)
#include int g = 0; void *threadFunc(void *arg){/* The thread function. Like main(), but for a thread */ char *str; str=(char*) arg; for (int i = 0; i < 6; i++) printf("%s (g = %d)\n",str, g++); return NULL; } void main(void) { pthread_t pth;// the thread identifier pthread_create(&pth,NULL,threadFunc,“I’m a thread..."); pthread_join(pth, NULL); /* wait for our thread to finish before continuing */ for (int i = 0; i < 10 ; ++I;}printf("main() is running...(g = %d)\n", g++); יצירת תתי תהליכים - סנכרון
output I'm a thread... (g = 0) I'm a thread... (g = 1) I'm a thread... (g = 2) I'm a thread... (g = 3) I'm a thread... (g = 4) I'm a thread... (g = 5) main() is running...(g = 6) main() is running...(g = 7) main() is running...(g = 8) main() is running...(g = 9) main() is running...(g = 10) main() is running...(g = 11)