操作系统实验2
TerminateThread(hThreadHandleE, 0);
TerminateThread(hThreadHandleF, 0);
}
三、实验结果
实验总结
这次实验刚开始完全不知道怎么做,后来在同学的帮助下有了实验的思路,通过这次实验我对Windows中的线程及进程如何创建有了一定的了解,有一定的收获
3、除了没有互斥,其它同2,结果显示在第四个文本框中。可见CSa和CSb两个临界区的执行是有交叉的,CSa的执行可能被CSb打断,CSb的执行也可能被CSa打断
二、源代码
UINT ThreadA(LPVOID pParam)
{
CThreadDlg * pParent=(CThreadDlg *)pParam;
}
}
}
创建进程:
void CThreadDlg::OnCreatethread()
{//创建线程A
hThreadHandleA = CreateThread(0, 0,
(LPTHREAD_START_ROUTINE) ThreadA,
(LPVOID)this, 0, (LPDWORD)&dwThreadIDA);
武 汉 工 程 大 学
计算机科学与工程学院
《操作系统》实验报告
专业班级
13计工01班
实验地点
计工403机房
学生学号
1305120610
指导教师
张立
学生姓名
李敏
实验时间
2014-10-19 /2014- 10-26
实验项目
实验二、创建线程及线程通信
实验类别
操作性() 验证性() 设计性(√) 综合性( ) 其它
{
CThreadDlg * pParent=(CThreadDlg *)pParam;
pParent->DoThreadC();
return 0;
}
UINT ThreadD(LPVOID pParam)
{
CThreadDlg * pParent=(CThreadDlg *)pParam;
pParent->DoThreadD();
pParent->DoThreadA();
return 0;
}
UINT ThreadB(LPVOID pParam)
{
CThreadDlg * pParent=(CThreadDlg *)pParam;
pParent->DoThreadB();
return 0;
}
UINT ThreadC(LPVOID pParam)
实 验 内 容
一、实验内容
要求:创建线程,利用互斥实现线程共享变量通信。
示例程序:Thread.exe
简要说明:
1、点“创建线程” 按钮,创建两个线程,一个线程不断对一个变量加1,结果显示在第一个文本框中。另一个线程不断对另一个变量减1,结果显示在第二个文本框中。这两个线程之间没有交互,仅用于演示线程的创建。
}
结束线程:
void CThreadDlg::OnThreadnomutex2()
{
TerminateThread(hThreadHandleA, 0);
TerminateThread(hThreadHandleB, 0);
TerminateThread(hThreadHandleC, 0);
TerminateThread(hThreadHandleD, 0);
实验目的及要求
(1)熟悉Windows中的线程及进程的创建
(2)掌握利用Windows中的同步机制实现线程同步及通信。
成 绩 评 定 表
类 别
评 分 标 准
分值
得分
合 计
上机表现
积极出勤、遵守纪律
主动完成实验设计任务
30分
实验报告
及时递交、填写规范
内容完整、体现收获
70分
说明:
评阅教师:张立
日期:2015年11月1日
{
m_pMutex =new CMutex;
//创建线程c
hThreadHandleC = CreateThread(0, 0,
(LPTHREAD_START_ROUTINE) ThreadC,
(LPVOID)this, 0, (LPDWORD)&dwThreadIDC);
//创建线程D
hThreadHandleD = CreateThread(0, 0,
{
CString s;
while(1)
{
m_pMutex->Lock();
for(int i=0;i<100;i++)
{
ShareCount--;
s.Format("%d",ShareCount);
mySetWinText(IDC_EDIT3,s);
MySleep(50);
}
m_pMutex->Unlock();
for(int i=0;i<100;i++)
{
ShareCount++;
s.Format("%d",ShareCount);
mySetWinText(IDC_EDIT3,s);
MySleep(50);
}
m_pMutex->Unlock();
}
}
void CThreadDlg::DoThreadD()
(LPTHREAD_START_ROUTINE) ThreadE,
(LPVOID)this, 0, (LPDWORD)&dwThreadIDE);
//创建线程D
hThreadHandleF = CreateThread(0, 0,
(LPTHREAD_START_ROUTINE) ThreadF,
(LPVOID)this, 0, (LPDWORD)&dwThreadIDF);
}
}
}
void CThreadDlg::DoThreadF()
{
CString s;
while(1)
{
for(int i=0;i<100;i++)
{
ShareCount1--;
s.Format("%d",ShareCount1);
mySetWinText(IDC_EDIT4,s);
MySleep(100);
}}Βιβλιοθήκη void CThreadDlg::DoThreadE()
{
CString s;
while(1)
{
for(int i=0;i<100;i++)
{
ShareCount1++;
s.Format("%d",ShareCount1);
mySetWinText(IDC_EDIT4,s);
MySleep(100);
//创建线程B
hThreadHandleB = CreateThread(0, 0,
(LPTHREAD_START_ROUTINE) ThreadB,
(LPVOID)this, 0, (LPDWORD)&dwThreadIDB);
}
线程互斥:
void CThreadDlg::OnThreadmutex()
2、演示线程互斥,点“线程互斥” 按钮,创建两个线程,一个线程不断循环,每次循环对共享变量x做100次加1操作(这100次加1操作作为一个临界区CSa),另一个线程不断循环,每次循环对共享变量x做100次减1操作(这100次减1操作作为一个临界区CSb),结果显示在第三个文本框中。可以看到结果是从0到100,然后又从100回到0。可见CSa和CSb两个临界区是互斥的。
(LPTHREAD_START_ROUTINE) ThreadD,
(LPVOID)this, 0, (LPDWORD)&dwThreadIDD);
}
非互斥运行:
void CThreadDlg::OnThreadnomutex()
{
//创建线程c
hThreadHandleE = CreateThread(0, 0,
{
int i=0;
CString s;
while(1)
{
i--;
s.Format("%d",i);
mySetWinText(IDC_EDIT2,s);
Sleep(1);
}
}
void CThreadDlg::DoThreadC()
{
CString s;
while(1)
{
m_pMutex->Lock();
return 0;
}
UINT ThreadE(LPVOID pParam)
{
CThreadDlg * pParent=(CThreadDlg *)pParam;
pParent->DoThreadE();
return 0;
}
UINT ThreadF(LPVOID pParam)
{
CThreadDlg * pParent=(CThreadDlg *)pParam;
pParent->DoThreadF();
return 0;
}
void CThreadDlg::DoThreadA()
{
int i=0;
CString s;
while(1)
{
i++;
s.Format("%d",i);