西 安 郵 電 大 學(xué)
(計(jì)算機(jī)學(xué)院)
操作系統(tǒng)課內(nèi)實(shí)驗(yàn)報(bào)告
實(shí)驗(yàn)名稱:互斥
專業(yè)名稱:計(jì)算機(jī)科學(xué)與技術(shù)
班 級(jí):計(jì)科1503
學(xué)生姓名:魏新超
學(xué)號(hào)(8位):04151091
指導(dǎo)教師:陳莉君
實(shí)驗(yàn)日期:2017年4月18日
一. 實(shí)驗(yàn)?zāi)康募皩?shí)驗(yàn)環(huán)境
通過(guò)觀察、分析實(shí)驗(yàn)現(xiàn)象,深入理解理解互斥鎖的原理及特點(diǎn)掌握在POSIX 規(guī)范中的互斥函數(shù)的功能及使用方法。
實(shí)驗(yàn)環(huán)境:deepin-15.3
二. 實(shí)驗(yàn)內(nèi)容
- 你預(yù)想deadlock.c 的運(yùn)行結(jié)果會(huì)如何?
線程1 ,2會(huì)交替運(yùn)行,且執(zhí)行到一半會(huì)終止。 - deadlock.c 的實(shí)際運(yùn)行結(jié)果如何?多次運(yùn)行每次的現(xiàn)象都一樣嗎?為什么會(huì)這樣?
交替執(zhí)行!每次執(zhí)行到一半都會(huì)終止。
每次運(yùn)行的結(jié)果不同。 線程終止是因?yàn)?,線程的推進(jìn)順序不合法。
為避免死鎖的產(chǎn)生,則應(yīng)調(diào)換線程1或線程2對(duì)1,2號(hào)資源加鎖的順序。即使線程1,2對(duì)1,2號(hào)資源的加鎖順序一致。即一次性為其分配了它所需要的所有資源,避免了死鎖的產(chǎn)生 - 把修改后的兩個(gè)程序的源代碼附在實(shí)驗(yàn)報(bào)告后。
三.方案設(shè)計(jì)
仔細(xì)閱讀程序,編譯程序后,先預(yù)計(jì)一下這個(gè)程序的運(yùn)行結(jié)果。運(yùn)行程序。若程序沒(méi)有響應(yīng),按ctrl+c 中斷程序運(yùn)行,然后再重新運(yùn)行,如此反復(fù)若干次,記錄下每次的運(yùn)行結(jié)果。若產(chǎn)生了死鎖,請(qǐng)修改程序,使其不會(huì)死鎖。
四.測(cè)試數(shù)據(jù)及運(yùn)行結(jié)果
![XC$(5VIMI{4Y8NDVZ_J7_P.png
![7W1GXE]Q(8Q99M2AC8SK6UG.png](http://upload-images.jianshu.io/upload_images/5878004-e9105f00bfd597a2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
五.總結(jié)
在本次實(shí)驗(yàn)中,我們了解到死鎖的情況,并實(shí)現(xiàn)加鎖與解鎖,從而實(shí)現(xiàn)解鎖緩沖區(qū)問(wèn)題,也了解到死鎖的機(jī)制。
六.附錄:源代碼(電子版, 紙質(zhì)版不打?。?/p>
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <ctype.h>
#include <pthread.h>
#define LOOP_TIMES 10000
pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
/*用宏P(guān)THREAD_MUTEX_INITIALIZER來(lái)初始化 */
pthread_mutex_t mutex2 = PTHREAD_MUTEX_INITIALIZER;
void* thread_worker(void*);
void critical_section(int thread_num, int i);
int main(void)
{
int rtn, i;
pthread_t pthread_id = 0; /* 存放子線程的id */
rtn = pthread_create(&pthread_id, NULL, thread_worker, NULL );
if(rtn != 0)
{
printf("pthread_create ERROR!\n");
return -1;
}
for (i=0; i<LOOP_TIMES; i++)
{
pthread_mutex_lock(&mutex2);
pthread_mutex_lock(&mutex1);
critical_section(1, i);
pthread_mutex_unlock(&mutex2);
pthread_mutex_unlock(&mutex1);
}
pthread_mutex_destroy(&mutex1);
pthread_mutex_destroy(&mutex2);
return 0;
}
void* thread_worker(void* p)
{
int i;
for (i=0; i<LOOP_TIMES; i++)
{
pthread_mutex_lock(&mutex2);
pthread_mutex_lock(&mutex1);
critical_section(2, i);
pthread_mutex_unlock(&mutex2);
pthread_mutex_unlock(&mutex1);
}
}
void critical_section(int thread_num, int i)
{
printf("Thread%d: %d\n", thread_num, i);
}