1. 程式人生 > >計算機作業系統第二次實驗——執行緒共享程序中的資料

計算機作業系統第二次實驗——執行緒共享程序中的資料

供大家交流學習,最好自己動手做,這樣才有最深切的體會。

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
    引數,以呼叫連結庫。因為pthread並非Linux系統的預設庫 。
  • 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下建立執行緒以及執行緒與程序間的關係,執行緒共享程序的地址空間,執行緒對資源的改變會影響到程序,執行緒能且只能分配到程序中的資源。