西 安 郵 電 大 學(xué)
(計(jì)算機(jī)學(xué)院)
操作系統(tǒng)課內(nèi)實(shí)驗(yàn)報(bào)告
實(shí)驗(yàn)名稱:互斥
專業(yè)名稱:計(jì)算機(jī)科學(xué)與技術(shù)
班 級:計(jì)科1503
學(xué)生姓名:魏新超
學(xué)號(8位):04151091
指導(dǎo)教師:陳莉君
實(shí)驗(yàn)日期:2017年4月18日
一. 實(shí)驗(yàn)?zāi)康募皩?shí)驗(yàn)環(huán)境
通過觀察洪规、分析實(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é)果會如何澄者?
線程1 听怕,2會交替運(yùn)行翰灾,且執(zhí)行到一半會終止该溯。 - deadlock.c 的實(shí)際運(yùn)行結(jié)果如何雅倒?多次運(yùn)行每次的現(xiàn)象都一樣嗎嫁佳?為什么會這樣挨队?
交替執(zhí)行!每次執(zhí)行到一半都會終止蒿往。
每次運(yùn)行的結(jié)果不同盛垦。 線程終止是因?yàn)椋€程的推進(jìn)順序不合法瓤漏。
為避免死鎖的產(chǎn)生腾夯,則應(yīng)調(diào)換線程1或線程2對1,2號資源加鎖的順序。即使線程1,2對1,2號資源的加鎖順序一致蔬充。即一次性為其分配了它所需要的所有資源蝶俱,避免了死鎖的產(chǎn)生 - 把修改后的兩個程序的源代碼附在實(shí)驗(yàn)報(bào)告后。
三.方案設(shè)計(jì)
仔細(xì)閱讀程序饥漫,編譯程序后榨呆,先預(yù)計(jì)一下這個程序的運(yùn)行結(jié)果。運(yùn)行程序庸队。若程序沒有響應(yīng)积蜻,按ctrl+c 中斷程序運(yùn)行,然后再重新運(yùn)行彻消,如此反復(fù)若干次竿拆,記錄下每次的運(yùn)行結(jié)果。若產(chǎn)生了死鎖宾尚,請修改程序丙笋,使其不會死鎖。
四.測試數(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ū)問題崔步,也了解到死鎖的機(jī)制。
六.附錄:源代碼(電子版缎谷, 紙質(zhì)版不打泳簟)
#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來初始化 */
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);
}