計算機作業系統第二次實驗——執行緒共享程序中的資料
阿新 • • 發佈:2019-02-17
供大家交流學習,最好自己動手做,這樣才有最深切的體會。
1.實驗目的
利用pthread_create()函式建立一個執行緒,線上程中更改程序中的資料 ,瞭解執行緒與程序之間的關係。
2.實驗軟硬體環境
- 安裝Windows XP的計算機
- VirtualBox軟體,以及在其上安裝的Ubuntu虛擬機器
3.實驗內容
在Linux下利用執行緒建立函式pthread_create()建立一個執行緒,線上程中更改程序中的資料,並分別線上程和main函式裡輸出執行緒的tid,將結果輸出到終端。
pthread_create()、sleep()函式介紹:
- int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void), void *restrict arg) 建立執行緒,若成功則返回0,否則返回出錯編號第一個引數為指向執行緒識別符號的指標。第二個引數用來設定 執行緒屬性。第三個引數是執行緒執行函式的起始地址。最後一個引數是執行函式的引數。另外,在編譯時注意加上-lpthread
- unsigned sleep(unsigned milliseconds) 執行掛起一段時間,引數為無符號整型變數,單位是毫秒。
4.實驗程式及分析
實驗程式:
#include<stdio.h> #include<pthread.h> #include<unistd.h> #include<stdlib.h> static int i = 1; //i是全域性變數 void *create(void *arg) { //函式名前加*,說明返回的是一個指向函式的指標 printf("new pthread ...\n"); printf("shared data = %d\n",i); printf("my tid is %ld\n",(unsigned long int)pthread_self()); //線上程中通過pthread_self()函式返回自己的pid,型別為無符號長整數(unsigned long int),在printf中用%ld格式化輸出。 i=2; //修改全域性變數i的值 return (void *)0; } int main() { pthread_t l; //l用來儲存執行緒的tid,資料型別pthread_t是無符號長整數(unsigned long int) i=3; //修改全域性變數i的值 if(pthread_create(&l,NULL,create,NULL)) { //pthread_create()函式需要四個引數,其中第一個是存執行緒tid的地址&l,並且會向l返回所建立執行緒的tid,第三個變數是執行緒程式的起始地址,即指向執行緒程式的指標 //pthread_create()函式成功則返回0,否則返回出錯編號 printf("create pthread failed\n"); return -1; } else { sleep(1); printf("create pthread successfully\n"); printf("And shared data = %d\n return tid = %ld\n",i,(unsigned long int)l); //輸出main中i的值以及pthread_create()函式所建立執行緒的ID——l的值 return 0; } int n = sizeof(pthread_t); printf("the pthread_t has %d Byte\n",n); }
終端結果:
分析:
執行緒共享程序的地址空間,所以執行緒對資源的改變會反映到程序中,故i之前為3,進入執行緒後被改為2,在程序中輸出為2.並且執行緒自己返回的tid與pthread_create()函式返回到l的值是一樣的。
5.實驗截圖
6.實驗心得體會
通過這次實驗,我瞭解到如何在Linux下建立執行緒以及執行緒與程序間的關係,執行緒共享程序的地址空間,執行緒對資源的改變會影響到程序,執行緒能且只能分配到程序中的資源。