多线程同步操作多个窗口

多线程同步操作多个窗口
多线程同步操作多个窗口

多线程同步操作多个窗口

RunApp "notepad.exe"

RunApp "notepad.exe"

RunApp "notepad.exe"

Delay 2000

Dimenv temp_Hwnd

temp_Hwnd = 0

Dim str, arr, i

str = Plugin.Window.Search("无标题- 记事本")

arr = Split(str, "|")

For i = 0 To UBound(arr) - 1

temp_Hwnd = Plugin.Window.FindEx(arr(i), 0, "Edit", 0)

BeginThread WriteString

While temp_Hwnd <> 0'判断多线程已经启动完毕,继续循环下一个。

Delay 500

Wend

Next

EndScript

Function WriteString()

Dim str, Hwnd

Hwnd = temp_Hwnd

temp_Hwnd = 0

Do

str = WaitKey

If Hwnd <> Plugin.Window.GetKeyFocusWnd Then

Call Plugin.Bkgnd.KeyPress(Hwnd, str)

End If

Loop

End Function

多线程多开窗口同步执行与子线程间的数值如何传递:

1.Dimenv IsThread, i

2.Dim arr_Thread()

3.For i = 0 To 2

4. IsThread = False'未启动线程

5. Redim Preserve arr_Thread(i)

6. arr_Thread(i) = BeginThread(EnterThread)

7. While IsThread = False'未启动成功,等待中

8. Delay 500

9. Wend

10. '跳出循环说明 IsThread = True,已经执行到了,循环继续启动下一个

11.Next

12.EndScript'结束主线,但子线程还会继续运行

13.'函数调用//////////////////////////////////////////

14.Function EnterThread()

15. Dim n

16. n = i

17. IsThread = True

18. Do

19. TracePrint "运行线程:" & n

20. Delay 500

21. Loop

22.End Function

多线程运行中单独停止某个子线程演示:

1.'环境变量声明

2.Dimenv Hwnd, IsThread

3.IsThread = False

4.Do

5. Hwnd = Plugin.Window.Find("Notepad", "无标题 - 记事本")

6. If Hwnd = 0 Then

7. RunApp "notepad.exe" : Delay 2000

8. TracePrint "运行记事本"

9. End If

10.Loop While Hwnd = 0

11.'获得记事本中输入子窗口句柄,以便按键输入内容

12.Hwnd = Plugin.Window.FindEx(Hwnd, 0, "Edit", 0)

13.'全局变量声明

14.Dim IdThread

15.'主循环↓

16.Do

17. If WaitKey() = 81 Then

18. If IsThread = False Then

19. IdThread = BeginThread(WriteString)

20. Do

21. TracePrint "等待线程启动!"

22. Delay 500

23. Loop While IsThread = False

24. TracePrint "线程启动成功!"

25. Else

26. TracePrint "线程停止操作!"

27. StopThread IdThread

28. IsThread = False

29. End If

30. End If

31.Loop

32.'以下是函数区域↓

33.Function WriteString()

34. IsThread = True

35. Do

36. Call Plugin.Bkgnd.KeyPress(Hwnd, 65)

37. Delay 500

38. Loop

39.End Function

主线程逐个开启子线程五开操作演示:

1.'五开操作

2.Dim str_Hwnd

3.str_Hwnd = vbNullString'记录都有哪些窗口句柄在运行

4.DimEnv IsHwnd

5.IsHwnd = 0

6.For i_win = 0 To 4

7. Do

8. RunApp "notepad.exe"

9. str = Plugin.Window.Search("无标题 - 记事本")

10. arr = Split(str, "|")

11. If str <> vbNullString Then

12. For i = 0 To UBound(arr) - 1

13. If InStr(str_Hwnd, arr(i)) = 0 Then

14. IsHwnd = arr(i)

15. str_Hwnd = str_Hwnd & arr(i) & "|"

16. Exit For

17. End If

18. Next

19. Else

20. IsHwnd = arr(0)

21. End If

22. Loop While IsHwnd = 0

23. Call Plugin.Window.SetClientSize(IsHwnd, 300, 300)

24. Call Plugin.Window.Move(IsHwnd, 300 * i_win, 0)

25. BeginThread 后台喊话

26. Do

27. Delay 1000

28. Loop Until Hwnd = 0

29.Next

30.EndScript

31.Function 后台喊话()

32. Dim Hwnd

33. Hwnd = Plugin.Window.FindEx(IsHwnd, 0, "Edit", 0)

34. IsHwnd = 0

35. Do

36. Call Plugin.Bkgnd.SendString(Hwnd, "文字测试")

37. Call Plugin.Bkgnd.KeyPress(Hwnd, 13)

38. Delay 500

39. Loop

40. End Function

一、多线程是什么,可以干什么

一般来说,我们编写的脚本都是一条道走到黑,最多加点循环、判断和跳转,程序始终是按部就班的执行指定的命令,只能同时干一件工作,让它取色就取色,让它单击就单击,不能同时完成两项以上的工作。多线程的出现,是让脚本可以同时开展几项工作,在单击时,可以通过环境变量传过来取色子程序获得的坐标,而无需在每次单击命令前执行调用取色子程序。当然这只是一个很简单的例子,像这样简单的情况,是没必要弄个多线程的,如果非要弄出多线程处理,反而要考虑到同步的问题:这边要单击了,

那边取色命令传过来的坐标值,是多长时间以前的?或者直接取色命令还没执行完,这边到底单击哪里呢?

有人说按键精灵的多线程是伪多线程,其实不管是真假多线程,对于电脑的CPU来说,同时只会做一件事情,只是说把各个线程传过来需要处理的东西按照时间先后和优先级的关系,排个队列挨个执行而已。就像你去食堂打饭,很多人排队打,但是打饭的师傅只有一个,关系好的可能能插个队。多核CPU大概是食堂有好几个窗口,这样的话,倒是有可能同时有几个同学在打饭。那么,我们假设要做的工作是让一个寝室的同学聚餐,可以派一个人去打饭(单线程),或者派几个人去打饭(多线程)。假设班长下达了命令:甲负责打菜,乙负责打饭,丙负责买汽水,其余的负责准备场地,那么什么时候开饭,应该要等到甲乙丙任务都完成了才行。可以约定时间,也可以让每个人报告。如果有一辆自行车可以用,那么甲乙丙三个人都可以骑,同时骑,也就相当与出现了三辆,谁的骑坏了都与别人的没关系。为了更好更快的完成人物,甲乙丙三人都可以同时拉剩下的人帮忙,比如丁,也会变成三个人,每个丁分身都与其他分身无关。好吧,不闲扯了,代码也不多贴,把我总结的规律直接写出来吧。

(一)首先要弄明白变量的作用域这个问题:

在按键里,有这些规律:

1.在主体代码最前面(最好这么干,你非要在中间写一句dim,我也没办法)用dim定义的变量(统称外部变量),作用范围为全脚本,但是如果在子程序里面出现用dim显式定义的同名变量或者在子程序参数列表里的同名变量,那么在该子程序体内所用到的该变量,是内部变量,与外部变量无关;

2.子程序中可以用dim关键字定义内部变量,如果未定义的变量直接使用,默认为外部变量。

3.外部变量如果出现在子程序中,并且子程序中没有定义过同名的内部变量,在正常的调用中,按外部变量处理,但是如果在多线程中调用这个子程序,那么该变量会自动变成内部变量初始化掉,具体情况如下:

1.Dim a //此处是否定义对多线程内部的变量a无影响

2.BeginThread cd

3.Sub cd

4. Dim a

5. //此处如果定义了,变量a为子程序cd的内部变量,

6. //否则如果此处为定义,且子程序cs中未定义,则变量a为整个多线程的外部变量

7. a = 23

8. Call cs(a)

9. TracePrint a

10. Call cs(a)

11. TracePrint a

12.End Sub

13.Sub cs(b)

14. Dim a

15. //此处如果定义了,变量a在子程序cs内部永远都是内部变量

16. //或者把b改成a,也是隐式的定义了一个内部变量a

17. a=a+b

18.End Sub

复制代码

4.在主题代码最前面用Global定义的是全局变量,作用范围多说同DimEnv环境变量,我猜这两个有一个可以在脚本之间交换数据。如果只是用于单脚本的多线程,可以看成一样的。这两个关键字都不能出现在子程序包括多线程的子程序中;

5.还有个大家关心的大漠等插件的绑定问题,规律如下:

1.Set dm = CreateObject("dm.dmsoft")

2.//此处绑定之后,程序主体中调用的子程序都可以使用大漠插件

3.call cs

4.BeginThread cd

5.Sub cd

6. Set dm = CreateObject("dm.dmsoft")

7. //此处绑定之后,此线程调用的任何子程序都可以使用大漠插件

8. Call cs

9.End Sub

10.Sub cs

11. hwnd = dm.GetForegroundWindow()

12. TracePrint hwnd

13.End Sub

复制代码

通过上面的归纳,更可以明确多线程基本等同与新建一个内部脚本,可以调用主脚本内的任何子程序资源,调用方式为创建一个该子程序的副本,独立与主程序体之外。如果要在某个多线程内定义一个可以在子程序间传递数据的变量,办法是直接给变量赋值,不要在它调用到的任何子程序中显式或者隐式的定义该变量。如果要实现在程序主体和多线程之间传递数据,需要在程序主体的最前面用DimEnv关键字定义环境变量。具体使用见后面的例子。

(二)多线程命令解释:

1.BeginThread 同时运行过程:可以理解为开辟一块新的内存空间来运行一个任务,在该多线程子程序中所调用的资源,统统纳入这个内存空间,如果需要与外界交换数据,必须通过DimEnv定义的环境变量来实现。为了便于控制每一个线程,调用时可以指定一个变量来保存线程ID,一般把这个变量定义为环境变量,这样可以在主体和线程以及线程之间实现互相控制。

2.PauseThread 暂停线程运行、ContinueThread 继续线程运行、StopThread 停止线程运行:通过线程ID来暂停、继续和停止一个线程,在论坛上看到一位高手用环境变量来实现了这个功能:

1.Dimenv 控制

2.……

3. BeginThread 过程1

4.……

5.控制 = "暂停"

6.……

7.控制 = "继续"

8.……

9.控制 = "停止"

10.……

11. EndScript

12. Sub 过程1

13.……

14. While 控制 = "暂停"

15. Delay 50

16. Wend

17. If 控制="停止" Then exit Sub

18. End Sub

复制代码

当然需要把这个控制代码插入到多线程子程序的循环体中来执行,也有缺点是必须运行到此处才能实现功能。这是题外话了,灵活的用好暂停、继续功能可以让脚本变得更灵活。比如在控制人物左右行走的子程序中,需要判断障碍物,如果X轴无变化就向上或者向下走,如果X,Y轴都没有变化就判断为卡住,执行卡住处置程序。可以把卡住判断和处置的代码放到一个多线程中,在左右行走子程序开始时打开卡住处置多线程并暂停,在x轴卡住时继续运行卡住处置多线程,实现上下移动并判断y轴值是否变化,如果没有变化就向相反方向走。左右移动的子程序中设置一个按左右行走键并判断x轴无变化就等待的循环,在退出循环时暂停卡住处置多线程。在左右行走的子程序结束的时候关掉卡住处置多线程。这样通过暂停、继续的运用,可以减少频繁的打开关闭多线程。代码如下:

1.Dimenv x, y,线程ID

2.……

3.Sub 左右移动

4.线程ID=BeginThread(障碍物判断)

5. PauseThread 线程ID

6. While 是否到底目的地=否

7.按左右键行走

8.调用取得人物坐标子程序

9. if x轴无变化 then

10. ContinueThread 线程ID

11. End if

12. while x轴无变化

13.按下左右键

14.等待一段时间

15.松开左右键

16.调用取得人物坐标子程序

17. Wend

18. PauseThread 线程ID

19. Wend

20. StopThread 线程ID

21.End Sub

22.Sub 障碍物判断

23. while True

24.按上下键行走

25.调用取得人物坐标子程序

26. if y轴无变化 then

27.把控制上下的键更换方向

28. End if

29. wend

30.End Sub

复制代码

3.GetThreadID 得到当前线程ID:这个从按键自带的例子来看,是在退出线程事件中,用来返回退出的线程ID,从而根据这个ID来确定是哪一个线程退出了,给该线程上绑定的例如大漠、361等插件松绑。这个命令只有在线程结束事件或者线程内部才能返回值,如果忘记在调用时保存线程ID,可以在线程内部使用这个命令获取自身的线程ID。

二、多线程什么情况下应该使用?

多线程使用的时机,大概有两种:一种是单脚本内需要控制开展多项工作,比如上面的例子,在左右行走卡住时开启上下行走和卡住判断;另一种是通过多线程的使用,实现一个脚本对多个游戏窗口的控制,也就是多开,下面就这两种情况说说我的看法。

(一)单脚本单开的多线程

这个是否使用多线程得看具体的情况来定,很多时候并不一定需要多线程才能解决问题,可以通过在循环内部插入某些判断代码来确定是否调用别的功能。例如上面的左右行走子程序,可以改成这样:

1.Sub 左右移动

2. While 是否到底目的地=否

3.按左右键行走

4.调用取得人物坐标子程序

5. while x轴无变化

6.按下左右键和上下键

7.等待一段时间

8.松开左右键和上下键

9.调用取得人物坐标子程序

10. If y轴无变化 Then

11.把控制上下的键更换方向

12. End If

13. Wend

14. Wend

15.End Sub

复制代码

如此通过对控制行走代码的修改,来实现绕过障碍物和卡住判断,无需调用多线程来解决问题。这样无需考虑两个线程之间的按键同步问题和互相干扰的问题,也不要定义多个环境变量来实现数据的交换。像一些比较复杂的脚本,需要同时开展的工作之间没有频繁的数据传递,且确实需要做到实时监控,那么就必须使用多线程了。比如在挂机打怪的时候需要监控草药或者矿产是否出现,一定出现就暂停打怪去采集(假设打怪时间可以暂停),采集完成后继续打怪,可以写出如下代码:

1.dimenv 打怪ID,采集ID

2.打怪ID=BeginThread(打怪)

3.采集ID=BeginThread(采集)

4.While true

5.

6.Wend

7.EndScript

8.Sub 打怪

9. While true

10.打怪

11. Wend

12.End Sub

13.Sub 采集

14. While true

15.判断草药是否出现

16. if 草药出现 then

17. PauseThread 打怪ID

18.采集草药

19. ContinueThread 打怪ID

20. end If

21. Wend

22.End Sub

复制代码

当然,在使用多线程时一定要考虑到各种情况的出现,避免在打怪的过程中暂停了打怪线程,导致采集时被怪物攻击的情况,或者采集时草药会集中出现,可以暂缓继续打怪程序,采集完成后继续找草药,

确实采集完成再继续打怪,以避免频繁的继续和暂停打怪程序。

(二)单脚本多开的多线程

这个需要考虑的问题就更多了,不提倡新手使用多线程,除了多线程不稳定的原因外,对变量作用域不明确、对程序流程的掌握不熟练也是一个原因。单脚本多开,要能够实现对任意线程的完美控制。我曾经想过用一个脚本实现单线程的各个游戏窗口之间的循环控制,这个思路可以用在对多线程的控制上:

1.枚举符合要求的窗口句柄;

2.把获得的窗口句柄保存在数组h中;

3.对需要做的每一个后台操作,在指定句柄时,循环到数组h中的每一个成员;

1.dim h

2.HwndEx = Plugin.Window.Search("记事本")

3.h = split(HwndEx, "|")

4.……

5.//假设有一个后台单击命令

6.For i=0 to UBound (h)

7.Call Plugin.Bkgnd.LeftClick(H(i), x, y)

8.Next i

复制代码

在控制多线程时,需要用到用户自定义界面,把线程ID保存在用户自定义界面的控件上,然后通过按键来实现对各个线程的完美控制。

三、如何实现多线程的灵活控制?

参考:https://www.360docs.net/doc/0b15334186.html,/thread-349064-1-1.html

这个帖子只是说明了多线程控制的思路,具体实现可以这样(还是要抱怨一句:按键的自定义界面不支持控件数组、不能动态添加list列表项,让这件事情变得很难办了):

先按照上图在自定义界面上弄5个文本框(用于手动写入线程标识,可以用角色名等区分,面对自己都搞不清哪个是哪个了)、5个单选按钮(用于保存线程ID和选定线程,如果想同时控制多个线程可以改成用复选框)、3个按钮(名称分别为ButtonPause、ButtonContinue、ButtonStop,用于操作选定线程),然后编写如下脚本:

1.DimEnv 线程ID

2.Dim i

3.i=1

4.While key <> 123

5. key=GetLastKey

6. If key=119 //自己设定的启动键

7.线程ID = BeginThread(能实现完整脚本功能的线程)

8. Select Case i

9. Case 1

10. form1.OptionBox1.Caption = 线程ID

11. Case 2

12. form1.OptionBox2.Caption = 线程ID

13.……

14. End Select

15. i=i+1

16. end if

17.Wend

18.//暂停

19.Event Form1.ButtonPause.Click

20. If form1.OptionBox1.Value=1 Then PauseThread form1.OptionBox1.Caption

21. If form1.OptionBox2.Value=1 Then PauseThread form1.OptionBox2.Caption

22.……

23.End Event

24.//继续

25.Event Form1.ButtonContinue.Click

26. If form1.OptionBox1.Value=1 Then ContinueThread form1.OptionBox1.Caption

27. If form1.OptionBox2.Value=1 Then ContinueThread form1.OptionBox2.Caption

28.……

29.End Event

30.//停止

31.Event Form1.ButtonStop.Click

32. If form1.OptionBox1.Value=1 Then StopThread form1.OptionBox1.Caption

33. If form1.OptionBox2.Value=1 Then StopThread form1.OptionBox2.Caption

34.……

35.End Event

复制代码

这个脚本实在是难看,没办法,要是按键能够支持数组控件就好了,还要有动态添加cmbbox或者listbox列表项的功能,就更简单了。

解决多线程中11个常见问题

并发危险 解决多线程代码中的11 个常见的问题 Joe Duffy 本文将介绍以下内容:?基本并发概念 ?并发问题和抑制措施 ?实现安全性的模式?横切概念本文使用了以下技术: 多线程、.NET Framework 目录 数据争用 忘记同步 粒度错误 读写撕裂 无锁定重新排序 重新进入 死锁 锁保护 戳记 两步舞曲 优先级反转 实现安全性的模式 不变性 纯度 隔离 并发现象无处不在。服务器端程序长久以来都必须负责处理基本并发编程模型,而随着多核处理器的日益普及,客户端程序也将需要执行一些任务。随着并发操作的不断增加,有关确保安全的问题也浮现出来。也就是说,在面对大量逻辑并发操作和不断变化的物理硬件并行性程度时,程序必须继续保持同样级别的稳定性和可靠性。 与对应的顺序代码相比,正确设计的并发代码还必须遵循一些额外的规则。对内存的读写以及对共享资源的访问必须使用同步机制进行管制,以防发生冲突。另外,通常有必要对线程进行协调以协同完成某项工作。 这些附加要求所产生的直接结果是,可以从根本上确保线程始终保持一致并且保证其顺利向前推进。同步和协调对时间的依赖性很强,这就导致了它们具有不确定性,难于进行预测和测试。 这些属性之所以让人觉得有些困难,只是因为人们的思路还未转变过来。没有可供学习的专门API,也没有可进行复制和粘贴的代码段。实际上的确有一组基础概念需要您学习和适应。很可能随着时间的推移某些语言和库会隐藏一些概念,但如果您现在就开始执行并发操作,则不会遇到这种情况。本

文将介绍需要注意的一些较为常见的挑战,并针对您在软件中如何运用它们给出一些建议。 首先我将讨论在并发程序中经常会出错的一类问题。我把它们称为“安全隐患”,因为它们很容易发现并且后果通常比较严重。这些危险会导致您的程序因崩溃或内存问题而中断。 当从多个线程并发访问数据时会发生数据争用(或竞争条件)。特别是,在一个或多个线程写入一段数据的同时,如果有一个或多个线程也在读取这段数据,则会发生这种情况。之所以会出现这种问题,是因为Windows 程序(如C++ 和Microsoft .NET Framework 之类的程序)基本上都基于共享内存概念,进程中的所有线程均可访问驻留在同一虚拟地址空间中的数据。静态变量和堆分配可用于共享。请考虑下面这个典型的例子: static class Counter { internal static int s_curr = 0; internal static int GetNext() { return s_curr++; } } Counter 的目标可能是想为GetNext 的每个调用分发一个新的唯一数字。但是,如果程序中的两个线程同时调用GetNext,则这两个线程可能被赋予相同的数字。原因是s_curr++ 编译包括三个独立的步骤: 1.将当前值从共享的s_curr 变量读入处理器寄存器。 2.递增该寄存器。 3.将寄存器值重新写入共享s_curr 变量。 按照这种顺序执行的两个线程可能会在本地从s_curr 读取了相同的值(比如42)并将其递增到某个值(比如43),然后发布相同的结果值。这样一来,GetNext 将为这两个线程返回相同的数字,导致算法中断。虽然简单语句s_curr++ 看似不可分割,但实际却并非如此。 忘记同步 这是最简单的一种数据争用情况:同步被完全遗忘。这种争用很少有良性的情况,也就是说虽然它们是正确的,但大部分都是因为这种正确性的根基存在问题。 这种问题通常不是很明显。例如,某个对象可能是某个大型复杂对象图表的一部分,而该图表恰好可使用静态变量访问,或在创建新线程或将工作排入线程池时通过将某个对象作为闭包的一部分进行传递可变为共享图表。 当对象(图表)从私有变为共享时,一定要多加注意。这称为发布,在后面的隔离上下文中会对此加以讨论。反之称为私有化,即对象(图表)再次从共享变为私有。 对这种问题的解决方案是添加正确的同步。在计数器示例中,我可以使用简单的联锁: static class Counter { internal static volatile int s_curr = 0; internal static int GetNext() { return Interlocked.Increment(ref s_curr);

实验2-2windows2000 线程同步

实验2 并发与调度 2.2 Windows 2000线程同步 (实验估计时间:120分钟) 背景知识 实验目的 工具/准备工作 实验内容与步骤 背景知识 Windows 2000提供的常用对象可分成三类:核心应用服务、线程同步和线程间通讯。其中,开发人员可以使用线程同步对象来协调线程和进程的工作,以使其共享信息并执行任务。此类对象包括互锁数据、临界段、事件、互斥体和信号等。 多线程编程中关键的一步是保护所有的共享资源,工具主要有互锁函数、临界段和互斥体等;另一个实质性部分是协调线程使其完成应用程序的任务,为此,可利用内核中的事件对象和信号。 在进程内或进程间实现线程同步的最方便的方法是使用事件对象,这一组内核对象允许一个线程对其受信状态进行直接控制 (见表4-1) 。 而互斥体则是另一个可命名且安全的内核对象,其主要目的是引导对共享资源的访问。拥有单一访问资源的线程创建互斥体,所有想要访问该资源的线程应该在实际执行操作之前获得互斥体,而在访问结束时立即释放互斥体,以允许下一个等待线程获得互斥体,然后接着进行下去。 与事件对象类似,互斥体容易创建、打开、使用并清除。利用CreateMutex() API 可创建互斥体,创建时还可以指定一个初始的拥有权标志,通过使用这个标志,只有当线程完成了资源的所有的初始化工作时,才允许创建线程释放互斥体。

为了获得互斥体,首先,想要访问调用的线程可使用OpenMutex() API来获得指向对象的句柄;然后,线程将这个句柄提供给一个等待函数。当内核将互斥体对象发送给等待线程时,就表明该线程获得了互斥体的拥有权。当线程获得拥有权时,线程控制了对共享资源的访问——必须设法尽快地放弃互斥体。放弃共享资源时需要在该对象上调用ReleaseMute() API。然后系统负责将互斥体拥有权传递给下一个等待着的线程(由到达时间决定顺序) 。 实验目的 在本实验中,通过对事件和互斥体对象的了解,来加深对Windows 2000线程同步的理解。 1) 回顾系统进程、线程的有关概念,加深对Windows 2000线程的理解。 2) 了解事件和互斥体对象。 3) 通过分析实验程序,了解管理事件对象的API。 4) 了解在进程中如何使用事件对象。 5) 了解在进程中如何使用互斥体对象。 6) 了解父进程创建子进程的程序设计方法。 工具/准备工作 在开始本实验之前,请回顾教科书的相关内容。 您需要做以下准备: 1) 一台运行Windows 2000 Professional操作系统的计算机。 2) 计算机中需安装Visual C++ 6.0专业版或企业版。 实验内容与步骤 1. 事件对象 2. 互斥体对象 1. 事件对象 清单2-1程序展示了如何在进程间使用事件。父进程启动时,利用CreateEvent() API创建一个命名的、可共享的事件和子进程,然后等待子进程向事件发出信号并终止父进程。在创建时,子进程通过OpenEvent() API打开事件对象,调用SetEvent() API使其转化为已接受信号状态。两个进程在发出信号之后几乎立即终止。 步骤1:登录进入Windows 2000 Professional。 步骤2:在“开始”菜单中单击“程序”-“Microsoft Visual Studio 6.0”–“Microsoft Visual C++ 6.0”命令,进入Visual C++窗口。

操作系统考研资料:第二章用户界面习题

实用文档用心整理 第二章用户接口 一、选择题(全做) 1.操作系统提供给程序员的接口是() A进程B系统调用C库函数D系统调用和库函数 2.用户在程序中试图读某文件的第100个逻辑块,使用操作系统的 ()接口 A系统调用B图形用户接口C原语D键盘命令 3.用户要在程序一级获得系统帮助,必须通过()。 A.进程调度 B.作业调度 C.键盘命令 D .系统调用 4.用户的应用程序和应用系统是通过()提供的支持和服务来使用系统资源完成其操作的。 A点击鼠标B键盘命令C系统调用D图形用户界面 5.用户可以通过()两种方式来使用计算机。 A命令方式和函数方式B命令方式和系统调用方式

实用文档用心整理 1^1 C命令方式和文件管理方式D设备管理方式和系统调用方式 6.系统调用的目的是()。 A.请求系统服务 B.终止系统服务 C.申请系统资源 D.释放系统资源 7.系统调用是由操作系统提供的内部调用,它()。 A.直接通过键盘交互方式使用 B.只能通过用户程序间接使用 C.是命令接口中的命令使用 D.与系统的命令一样 8.操作系统内核与用户程序、应用程序之间的接口是()。 A. shell命令 B.图形界面 C.系统调用 D. C语言函数 9.当CPU执行操作系统代码时,称处理机处于()。 A执行态B目态C管态D就绪态 10.为了便于用户直接或间接地控制自己的作业,操作系统向用户提 供了命令接口,该接口又可进一步分为()。 2

A联机用户接口和脱机用户接口B程序接口和图形接口 C联机用户接口和程序接口D脱机用户接口和图形接口 二、填空题 1.用户在一次解题或一个事务处理过程中要求计算机系统所做工作 的集合称为________ 。 2.所谓系统调用,就是用户在程序中调用 _____ 所提供的一些子功能。 三、简答题 1.脱机命令接口和联机命令接口有什么不同? 2.处理机为什么要区分核心态和用户态两种操作方式?什么情况下进行两种方式的转换? 3.简述系统调用与函数调用有什么相同和不同点。 4.区别概念:操作命令与系统调用 5.简述系统调用的实现过程 6.命令接口和图形用户接口分别有什么优缺点?

第二章 操作系统

第二章操作系统 一、单选题 1.在windows中,下列叙述中错误的是(A) A.不支持即插即用 B.可支持鼠标操作 C.桌面上可同时容纳多个窗口 D.可同时运行多个程序 2.在资源管理器中窗口,若希望显示文件的名称、类型、大小等信息,应选择“查看” 菜单中的(C) A.小图标 B.大图标 C.详细资料 D.列表 3.已选定文件夹后,下列操作中能删除该文件夹的是(C) A.在“编辑”菜单中选择“撤销”命令 B.用鼠标左键单击该文件夹 C.在“文件”菜单中选择“删除”命令 D.用鼠标左键双击该文件夹 4.在windows环境中,对磁盘文件进行有效管理的工具是(A)。 A、“资源管理器”或“我的电脑” B、“文件管理器” C、“我的公文包” D、“写字板” 5.在windows开始菜单下的“文档”菜单中存放的是(A) A、最近打开过的文档 B、最近建立的文件夹 C、最近运行过的程序 D、最近建立的文档 6.以下关于windows中快捷方式的说法正确的是(C) A、快捷方式创建好了以后就不能修改 B、快捷方式占用的内存空间非常大 C、快捷方式提供了一种快速访问文件和程序的方法 D、快捷方式不可以由用户自己创建 7.windows桌面的外观设置是在“控制面板”中的(A)属性中设置 A、显示 B、区域设置 C、系统 D、多媒体 8.鼠标是windows环境中的一种重要的(B) A、画图工具 B、输入工具 C、指示工具

D、输出工具 9.下列描述中,正确的是(A) A、激光打印机是非击打式打印机 B、鼠标器是一种即可作输入又可作输出的设备 C、windows是一种应用软件 D、PowerPoint是一种系统软件 10在Windows中“任务栏”的主要作用是(D)。 A、显示系统的所有功能 B、只显示正在后台工作的窗口名 C、只显示当前活动窗口名 D、实现窗口间切换 11.Windows的“桌面”指的是(D)。 A、活动窗口 B、某个窗口 C、全部窗口 D、Windows启动后的整个屏幕 12.在屏幕上可以同时显示多个窗口,可以根据窗口的(A)栏的颜色来判断它是否是当前活动窗口 A、标题 B、菜单 C、状态 D、符号 13.下面关于中文Windows文件名的叙述中错误的是(C)。 A、文件名允许使用多个圆点分隔符 B、文件名允许使用空格 C、文件名允许使用竖线(“|”) D、文件名允许使用汉字 14、在Windows中,带子菜单的菜单选项标记是(C)。 A、选项前带“√” B、选项前带“?” C、选项后带三角符 D、选项后带“…” 15、下列关于Windows剪贴板的叙述中,(B)是错误的。 A、按下Alt+PrintScreen键或Printscreen键都会往剪贴板中送信息 B、剪贴板中可以保存多次“复制”操作的内容 C、剪贴板中的信息可以保存到磁盘文件中长期保存 D、凡是有“剪切”和“复制”命令的地方,都可以把选取的信息送到剪贴板中去 16、下列不能出现在Windows资源管理器窗口左部的选项是(C)。 A、(C:) B、桌面 C、资源管理器 D、我的电脑 17.以下关于Windows中快捷方式的说法正确的是:(A) A、快捷方式提供了一种快速访问文件和程序的方法 B、快捷方式不可以由用户自己创建 C、快捷方式占用的内存空间非常大 D、快捷方式创建好了以后就不能修改 18.Windows的“我的电脑”窗口中,若已选定了文件或文件夹,为了设置其属性打开属性对话框,其操作是(C) A、用鼠标右键单击“查看”菜单中“工具栏”下的“属性”图标

4:一个经典的多线程同步问题汇总

一个经典的多线程同步问题 程序描述: 主线程启动10个子线程并将表示子线程序号的变量地址作为参数传递给子线程。子线程接收参数 -> sleep(50) -> 全局变量++ -> sleep(0) -> 输出参数和全局变量。 要求: 1.子线程输出的线程序号不能重复。 2.全局变量的输出必须递增。 下面画了个简单的示意图: 分析下这个问题的考察点,主要考察点有二个: 1.主线程创建子线程并传入一个指向变量地址的指针作参数,由于线程启动须要花费一定的时间,所以在子线程根据这个指针访问并保存数据前,主线程应等待子线程保存完毕后才能改动该参数并启动下一个线程。这涉及到主线程与子线程之间的同步。 2.子线程之间会互斥的改动和输出全局变量。要求全局变量的输出必须递增。这涉及到各子线程间的互斥。 下面列出这个程序的基本框架,可以在此代码基础上进行修改和验证。 //经典线程同步互斥问题 #include #include #include long g_nNum; //全局资源 unsigned int__stdcall Fun(void *pPM); //线程函数 const int THREAD_NUM = 10; //子线程个数 int main() { g_nNum = 0;

HANDLE handle[THREAD_NUM]; int i = 0; while (i < THREAD_NUM) { handle[i] = (HANDLE)_beginthreadex(NULL, 0, Fun, &i, 0, NULL); i++;//等子线程接收到参数时主线程可能改变了这个i的值} //保证子线程已全部运行结束 WaitForMultipleObjects(THREAD_NUM, handle, TRUE, INFINITE); return 0; } unsigned int__stdcall Fun(void *pPM) { //由于创建线程是要一定的开销的,所以新线程并不能第一时间执行到这来int nThreadNum = *(int *)pPM; //子线程获取参数 Sleep(50);//some work should to do g_nNum++; //处理全局资源 Sleep(0);//some work should to do printf("线程编号为%d 全局资源值为%d\n", nThreadNum, g_nNum); return 0; } 运行结果:

多线程同步操作多个窗口

多线程同步操作多个窗口 RunApp "notepad.exe" RunApp "notepad.exe" RunApp "notepad.exe" Delay 2000 Dimenv temp_Hwnd temp_Hwnd = 0 Dim str, arr, i str = Plugin.Window.Search("无标题- 记事本") arr = Split(str, "|") For i = 0 To UBound(arr) - 1 temp_Hwnd = Plugin.Window.FindEx(arr(i), 0, "Edit", 0) BeginThread WriteString While temp_Hwnd <> 0'判断多线程已经启动完毕,继续循环下一个。 Delay 500 Wend Next EndScript Function WriteString() Dim str, Hwnd Hwnd = temp_Hwnd temp_Hwnd = 0 Do str = WaitKey If Hwnd <> Plugin.Window.GetKeyFocusWnd Then Call Plugin.Bkgnd.KeyPress(Hwnd, str) End If Loop End Function 多线程多开窗口同步执行与子线程间的数值如何传递: 1.Dimenv IsThread, i 2.Dim arr_Thread() 3.For i = 0 To 2 4. IsThread = False'未启动线程 5. Redim Preserve arr_Thread(i) 6. arr_Thread(i) = BeginThread(EnterThread) 7. While IsThread = False'未启动成功,等待中 8. Delay 500 9. Wend 10. '跳出循环说明 IsThread = True,已经执行到了,循环继续启动下一个 11.Next

操作系统原理第二章 用户界面习题

第二章用户接口 一、选择题(全做) 1.操作系统提供给程序员的接口是( ) A 进程 B 系统调用 C 库函数 D 系统调用和库函数 2. 用户在程序中试图读某文件的第100个逻辑块,使用操作系统的()接口 A 系统调用 B 图形用户接口 C 原语 D 键盘命令 3.用户要在程序一级获得系统帮助,必须通过()。 A.进程调度 B.作业调度 C.键盘命令 D .系统调用 4.用户的应用程序和应用系统是通过( )提供的支持和服务来使用系统资源完成其操作的。 A 点击鼠标 B 键盘命令 C 系统调用 D 图形用户界面 5. 用户可以通过()两种方式来使用计算机。 A 命令方式和函数方式 B 命令方式和系统调用方式 C 命令方式和文件管理方式 D 设备管理方式和系统调用方式 6.系统调用的目的是()。 A. 请求系统服务 B. 终止系统服务 C. 申请系统资源 D. 释放系统资源 7. 系统调用是由操作系统提供的内部调用,它()。 A. 直接通过键盘交互方式使用 B. 只能通过用户程序间接使用 C. 是命令接口中的命令使用 D. 与系统的命令一样

8.操作系统内核与用户程序、应用程序之间的接口是()。 A. shell 命令 B. 图形界面 C. 系统调用 D. C 语言函数 9.当CPU执行操作系统代码时,称处理机处于()。 A 执行态 B 目态 C 管态 D 就绪态 10.为了便于用户直接或间接地控制自己的作业,操作系统向用户提供了命令接口,该接口又可进一步分为()。 A 联机用户接口和脱机用户接口 B 程序接口和图形接口 C 联机用户接口和程序接口 D 脱机用户接口和图形接口 二、填空题 1. 用户在一次解题或一个事务处理过程中要求计算机系统所做工作的集合称为。 2.所谓系统调用,就是用户在程序中调用所提供的一些子功能。 三、简答题 1. 脱机命令接口和联机命令接口有什么不同? 2.处理机为什么要区分核心态和用户态两种操作方式?什么情况下进行两种方式的转换? 3.简述系统调用与函数调用有什么相同和不同点。 4. 区别概念:操作命令与系统调用 5. 简述系统调用的实现过程 6. 命令接口和图形用户接口分别有什么优缺点? 7. 何谓脱机I/O和联机I/O?

用多线程同步方法解决生产者-消费者问题(操作系统课设)

. 题目用多线程同步方法解决生产者-消费 者问题(Producer-Consumer Problem) 学院计算机科学与技术学院 专业软件工程 班级 姓名 指导教师 年月日

目录 目录 (1) 课程设计任务书 (2) 正文 (2) 1.设计目的与要求 (2) 1.1设计目的 (2) 1.2设计要求 (2) 2.设计思想及系统平台 (2) 2.1设计思想 (2) 2.2系统平台及使用语言 (2) 3.详细算法描述 (3) 4.源程序清单 (5) 5.运行结果与运行情况 (10) 6.调试过程 (15) 7.总结 (15) 本科生课程设计成绩评定表 (16)

课程设计任务书 学生姓名:专业班级: 指导教师:工作单位:计算机科学与技术学院 题目: 用多线程同步方法解决生产者-消费者问题 (Producer-Consumer Problem) 初始条件: 1.操作系统:Linux 2.程序设计语言:C语言 3.有界缓冲区内设有20个存储单元,其初值为0。放入/取出的数据项按增序设定为1-20这20个整型数。 要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要 求) 1.技术要求: 1)为每个生产者/消费者产生一个线程,设计正确的同步算法 2)每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的当前全部内容、当前指针位置和生产者/消费者线程的自定义标识符。 3)生产者和消费者各有两个以上。 4)多个生产者或多个消费者之间须共享对缓冲区进行操作的函数代码。 2.设计说明书内容要求: 1)设计题目与要求 2)总的设计思想及系统平台、语言、工具等。 3)数据结构与模块说明(功能与流程图) 4)给出用户名、源程序名、目标程序名和源程序及其运行结果。(要注明存储各个程序及其运行结果的主机IP地址和目录。) 5)运行结果与运行情况 (提示: (1)有界缓冲区可用数组实现。 (2)编译命令可用:cc -lpthread -o 目标文件名源文件名 (3)多线程编程方法参见附件。) 3. 调试报告: 1)调试记录 2)自我评析和总结 上机时间安排: 18周一~ 五 08:0 - 12:00 指导教师签名:年月日

第二章windows7操作系统习题

第二章Windows 7操作系统习题 一、是非题 1.操作系统是计算机最基本的系统软件。 A. 对 B. 错 2.在单用户操作系统中,系统所有的硬件软件资源只能为一个用户提供服务. A. 对 B. 错 是一个多任务操作系统。 A. 对 B. 错 4.默认情况下, Windows7 的桌面上只显示”回收站”一个图标. A. 对 B. 错 5.在Windows 7 中,用户要在打开的多个窗口中切换,可使用“Alt+Enter”组合键。 A. 对 B. 错 6.“资源管理器”是Windows系统提供的硬件管理工具。 A. 对 B. 错 7.在Windows 7 中,将删除的文件暂时保存在“回收站”中,使逻辑删除而不是物理删除。 A. 对 B. 错 8.在Windows 7 中,文件或文件夹的设置为“只读”属性,则用户只能查看文件或文件夹的内容,而不能对其进行任何修改操作。 A. 对 B. 错 9.在Windows 7 中,“磁盘清理”程序是从计算机中删除文件和文件夹,以提高系统性能。 A. 对 B. 错 10. 在Windows 7 中,快捷方式是指向计算机上某个文件、文件夹或程序的链接。 A. 对 B. 错 11. 在Windows 7 中,将快捷方式从桌面删除,就删除了该快捷方式链接的文件和程序。 A. 对 B. 错 12. Windows 7 在外观上的最显著改进就是任务栏。

A. 对 B. 错 13. 在Windows 7 中,通常可以通过不同的图标来区分文件类型。 A. 对 B. 错 14. 在Windows 7 中,文件名可以根据需要进行更改,文件的扩展名也能根据需要更改。 A. 对 B. 错 15.写字板时Windows 7附带的一款创建和编辑文本的工具。其不仅可以用来编辑文本,而且可以插入图形、图片,以及连接和嵌入对象等。 A. 对 B. 错 二、单选题 7 系统正确的关机的过程是 A. 在运行Windows 7 时直接关机 B. 选择“开始”菜单的“关机”命令关闭所有运行程序 C. 先退到DOS系统,再关闭电源 D. 关闭所有任务栏的窗口后,再关闭电源 2.安装Windows 7 时,硬盘应该格式化的类型是 A. FAT B. FAT32 C. NTFS D. 无论什么都可以 7 不是的操作系统。 A. 分布式 B.“即插即用”功能 C. 图形界面 D. 多任务 4.在Windows 桌面上已经有某个应用程序的图标,要运行该程序,只需 A.单击该图标 B.双击该图标 C. 右击该图标 D. 右键双击该图标 5.在Windows 7 中,“桌面”指的是。 A. 活动窗口 B. 某个窗口 C. 全部窗口 D. 整个屏幕 6.当一个在前台运行的应用程序窗口被最小化后,该应用程序将 A.被终止运行 B. 继续在前台运行 C. 被暂停运行 D. 被转入后台运行 7.在Windows 7桌面上,打开资源管理器的操作方法是。 A.右击任务栏,然后从弹出的快捷菜单选择“资源管理器”命令

四种进程或线程同步互斥的控制方法

四种进程或线程同步互斥的控制方法 1、临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。 2、互斥量:为协调共同对一个共享资源的单独访问而设计的。 3、信号量:为控制一个具有有限数量用户资源而设计。 4、事件:用来通知线程有一些事件已发生,从而启动后继任务的开始。 一临界区 临界区的使用在线程同步中应该算是比较简单,说它简单还是说它同后面讲到的其它方法相比更容易理解。举个简单的例子:比如说有一个全局变量(公共资源)两个线程都会对它进行写操作和读操作,如果我们在这里不加以控制,会产生意想不到的结果。假设线程A 正在把全局变量加1然后打印在屏幕上,但是这时切换到线程B,线程B又把全局变量加1然后又切换到线程A,这时候线程A打印的结果就不是程序想要的结果,也就产生了错误。解决的办法就是设置一个区域,让线程A在操纵全局变量的时候进行加锁,线程B如果想操纵这个全局变量就要等待线程A释放这个锁,这个也就是临界区的概念。 二互斥体 windows api中提供了一个互斥体,功能上要比临界区强大。也许你要问,这个东东和临界区有什么区别,为什么强大?它们有以下几点不一致: 1.critical section是局部对象,而mutex是核心对象。因此像waitforsingleobject是不可以等待临界区的。 2.critical section是快速高效的,而mutex同其相比要慢很多 3.critical section使用围是单一进程中的各个线程,而mutex由于可以有一个名字,因此它是可以应用于不同的进程,当然也可以应用于同一个进程中的不同线程。 4.critical section 无法检测到是否被某一个线程释放,而mutex在某一个线程结束之后会产生一个abandoned的信息。同时mutex只能被拥有它的线程释放。下面举两个应用mutex 的例子,一个是程序只能运行一个实例,也就是说同一个程序如果已经运行了,就不能再运行了;另一个是关于非常经典的哲学家吃饭问题的例子。 三事件 事件对象的特点是它可以应用在重叠I/O(overlapped I/0)上,比如说socket编程中有两种模型,一种是重叠I/0,一种是完成端口都是可以使用事件同步。它也是核心对象,因此可以被waitforsingleobje这些函数等待;事件可以有名字,因此可以被其他进程开启。 四信号量 semaphore的概念理解起来可能要比mutex还难,我先简单说一下创建信号量的函数,因为我在开始使用的时候没有很快弄清楚,可能现在还有理解不对的地方,如果有错误还是请大侠多多指教。 CreateSemaphore( LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, // SD LONG lInitialCount, // initial count LONG lMaximumCount, // maximum count LPCTSTR lpName // object name )

Windows下多线程同步机制

多线程同步机制 Critical section(临界区)用来实现“排他性占有”。适用范围是单一进程的各线程之间。它是: ·一个局部性对象,不是一个核心对象。 ·快速而有效率。 ·不能够同时有一个以上的critical section被等待。 ·无法侦测是否已被某个线程放弃。 Mutex Mutex是一个核心对象,可以在不同的线程之间实现“排他性占有”,甚至几十那些现成分属不同进程。它是: ·一个核心对象。 ·如果拥有mutex的那个线程结束,则会产生一个“abandoned”错误信息。 ·可以使用Wait…()等待一个mutex。 ·可以具名,因此可以被其他进程开启。 ·只能被拥有它的那个线程释放(released)。 Semaphore Semaphore被用来追踪有限的资源。它是: ·一个核心对象。 ·没有拥有者。 ·可以具名,因此可以被其他进程开启。 ·可以被任何一个线程释放(released)。 Ev ent Object Ev ent object通常使用于overlapped I/O,或用来设计某些自定义的同步对象。它是: ·一个核心对象。 ·完全在程序掌控之下。 ·适用于设计新的同步对象。 · “要求苏醒”的请求并不会被储存起来,可能会遗失掉。 ·可以具名,因此可以被其他进程开启。 Interlocked Variable 如果Interlocked…()函数被使用于所谓的spin-lock,那么他们只是一种同步机制。所谓spin-lock是一种busy loop,被预期在极短时间内执行,所以有最小的额外负担(overhead)。系统核心偶尔会使用他们。除此之外,interlocked variables主要用于引用技术。他们:·允许对4字节的数值有些基本的同步操作,不需动用到critical section或mutex之类。 ·在SMP(Symmetric Multi-Processors)操作系统中亦可有效运作。 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

操作系统原理-第二章 用户界面

第二章用户界面 2.1 知识点汇总 1、作业及作业步 图2-1 作业及作业步 2、系统调用:用户程序中对操作系统的调用称为系统调用。使用户程序通过简单的调用,来实现一些硬件相关,应用无关的工作,从而简化了用户程序。 独立程序:不需要操作系统帮助的程序(包括程序的启动和结束) 非独立程序:需要操作系统帮助的程序 图2-2 系统调用的执行过程 系统调用的特点: (1)系统调用指令是由硬件决定的(即:CPU中的中断向量表)。 CPU的指令集中都有一条系统调用指令,又称访管指令 但系统调用具体实现的功能由操作系统决定(即:操作系统中的,系统调用分支表,及系统调用代码)。 因此:同一种计算机上的不同操作系统,系统调用指令是相同的。同一操作系统,在不

同的计算机上,系统调用指令是不同的。 (2)系统调用是动态连接的 静态连接:程序在编译时,将被调用的程序嵌入到自身中。如:库函数调用 动态连接:程序在执行的过程中,执行到调用指令时,才连接到被调用的程序并执行。如:动态连接库(dynamic link library,DLL),系统调用。 由于操作系统是动态连接的,所以,缩短了用户程序,使用户程序和操作系统提供的系统调用功能相互独立。 (3)系统调用的调用地址和返回地址不是固定的。 系统调用的地址,由系统启动装载操作系统时,存放系统调用代码的位置决定,每次开机都可能存放在不同的位置上。 返回地址,由用户程序中系统调用指令的位置决定。 (4)安全接口 在执行系统调用和从系统调用中返回时,要分别保存和恢复程序状态字PSW,并设置PSW中的系统态/用户态标志位,进行系统态和用户态的切换。 执行系统调用时,进入系统态。从系统调用中返回用户程序时,进入用户态。 状态切换的目的:某些特权指令只能在系统态下执行。一些地址,只能在系统态下访问。从而限制了用户程序不能随意地进入操作系统区域,读写操作系统的内部代码,也限制了用户程序不能随意进入其它用户程序的区域。 中断:是指计算机在执行程序的过程中,当遇到需要立即处理的事件时,立即暂停当前正在运行的程序,转去执行有关服务程序,处理完后自动返回原程序。 发生中断的原因:系统调用,程序异常,IO事件完成,时间片结束,等等。可以归结为两大方面,一任务间切换的时候发生中断,二由用户态进入系统态时发生中断。 中断的执行过程:保存现场,将PSW等现场信息放入堆栈中,然后转去相应的中断处理程序。中断结束返回时,恢复现场,从堆栈中取出PSW等现场信息。继续执行原程序。2.2 例题解析 【例2.2.1】操作系统向用户提供了哪几类接口? 答:操作系统向用户提供了两类接口:一类是命令接口,另一类是程序接口。用户利用命令接口提供的操作命令来组织和控制作业的执行,按命令接口对作业控制方式不同,又可以将命令接口分为联机命令接口和脱机命令接口;用户还可以利用程序接口提供的一组系统调用来请求并获得操作系统服务,程序接口在用户编制程序的时候使用。今年来,为了方便用户的使用,又出现了图形接口。 【例2.2.2】试说明作业和进程的状态,并说明引起状态转换的典型原因。 答:作业的状态有提交状态、后备状态、运行状态和完成状态。 当一个作业还未进入算机系统内之前,用户正在向系统提交作业时所处的状态叫做提交状态。送入计算机并由操作系统将其存放在磁盘上以后,系统为这个作业建立一个作业控制

用多线程同步方法解决生产者-消费者问题(操作系统课设)

用多线程同步方法解决生产者-消费者问题(操作系统课设)

题目 用多线程同步方法解决生产者-消费 者问题(Producer-Consume r Problem) 学院 物理学与电子信息工程学院 专业电子信息工程班级08电信本一班姓名 指导教师 2010 年12 月日

目录 目录 0 课程设计任务书 (1) 正文 (3) 1.设计目的与要求 (3) 1.1设计目的 (3) 1.2设计要求 (3) 2.设计思想及系统平台 (3) 2.1设计思想 (3) 2.2系统平台及使用语言 (3) 3.详细算法描述 (4) 4.源程序清单 (7) 5.运行结果与运行情况 (12) 6.调试过程 (16) 7.总结 (16)

课程设计任务书 题目: 用多线程同步方法解决生产者-消费者问题 (Producer-Consumer Problem) 初始条件: 1.操作系统:Linux 2.程序设计语言:C语言 3.有界缓冲区内设有20个存储单元,其初 值为0。放入/取出的数据项按增序设定为 1-20这20个整型数。 要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求) 1.技术要求: 1)为每个生产者/消费者产生一个线程,设计正确的同步算法 2)每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的当前全部 内容、当前指针位置和生产者/消费者

线程的自定义标识符。 3)生产者和消费者各有两个以上。 4)多个生产者或多个消费者之间须共享对缓冲区进行操作的函数代码。 2.设计说明书内容要求: 1)设计题目与要求 2)总的设计思想及系统平台、语言、工具 等。 3)数据结构与模块说明(功能与流程图) 4)给出用户名、源程序名、目标程序名和源程序及其运行结果。(要注明存储各个 程序及其运行结果的主机IP地址和目 录。) 5)运行结果与运行情况 (提示: (1)有界缓冲区可用数组实现。 (2)编译命令可用:cc -lpthread -o 目标文件名源文件名 (3)多线程编程方法参见附件。) 3. 调试报告: 1)调试记录 2)自我评析和总结

计应 第二章 Windows 7操作系统 试题

第二章 Windows 7操作系统 一、选择题 1.Windows7系统中的“桌面”是指()。 A.整个频幕 B.某个窗口 C.当前窗口 D.全部窗口 2.下列属于计算机操作系统的是()。 A.Windows 7 B.Linux C.UNIX D.以上全部 3.在Windows 7中,打开一个菜单后,其中某菜单项会出现与之对应的级联菜单的标识是()。 A.菜单项右侧有一组英文提示 B.菜单项右侧有一个黑色三角形 C.菜单项左侧有一个黑色圆点 D.菜单项左侧有一个“√”符号 4.在Windows 7中,能弹出对话框的操作是()。 A.选择了带三角形箭头的菜单项 B.运行了与对话框对应的应用程序 C.选择了颜色变灰的菜单项 D.选择了带省略号的菜单项 5.把Windows 7的窗口和对话框作一比较,窗口可以移动和改变大小,而对话框()。 A.既不能移动,也不能改变大小 B.仅可以移动,不能改变大小 C.仅可以改变大小,不能移动 D.既能移动,也能改变大小 6.Windows 7操作系统中,显示3D桌面效果的快捷键是()。 A.Alt+Tab B.Win+shift C.Ctrl+Tab D.Win+Tab 7.在Windows 7操作系统中,进行窗口切换的快捷键是()。 A.Alt+W B.Alt+Tab C.Alt+F D.Alt+N 8.剪贴板的作用是()。 A.临时存放剪切或复制的信息 B.作为资源管理器管理的工作区 C.长期保存信息的存储区 D.在使用Dos 时,划给的临时区域 9.在Windows 7中,剪贴板是程序和文件间用来传递信息的临时存储区,此存储区是()。 A.回收站的一部分 B.硬盘的一部分 C.软盘的一部分 D.内存的一部分 10.Windows 7中,若要选定当前文件夹中的全部文件和文件夹对象,可使用的组合键是()。 A.Ctrl+V B.Ctrl+A C.Ctrl+X D.Ctrl+D 11.在Windows中连续进行了多次剪切操作后,“剪贴板”中存放的是()。 A.空白 B.最后一次剪切的内容 C.第一次剪切的内容 D.所有剪切过的内容 12.用鼠标直接运行带有图标的Windows程序,所要用的操作是()。 A.双击 B.单击 C.拖动 D.选中 13.更改Windows 7主题主要包括()。 A.更改桌面背景 B.更改窗口颜色 C.更改声音和屏幕保护程序 D.以上都对 14.如果某个程序窗口被最小化,则程序将()。 A.终止运行 B.暂停运行 C.转入后台运行 D.继续前台运行 15.在“资源管理器”窗口中,如果想一次选定多个连续的文件,正确的操作是()。 A.单击第一个文件,按住Shift键,单击最后一个文件 B.单击第一个文件,按住Ctrl键,单击最后一个文件 C.按住Ctrl键,按住鼠标右键逐个选取 D.按住Shift键,按住鼠标左键逐个选取 16.在Windows 7的“资源管理器”中,已选定文件夹后,下列操作中不能删除该文件夹的操作是()。 A.在键盘上按Delete键 B.用鼠标左键双击该文件夹 C.在“文件”菜单中选择“删除”命令 D.右击该文件夹,在弹出的快捷菜单中选择“删除”命令 17.在Windows7“资源管理器”中,进行文件复制可以先右击文件图标,在弹出的快捷菜单中选择“复制”命令,再右击目标文件夹或磁盘,在弹出的快捷菜单中选择()命令。 A.粘贴 B.移动 C .拷贝 D.全选 18.下面“不合法”的文件名是()。 A.12345678?.TXT B.WIN_PROG.EXE C.FILE.DAT D.35768.TXT 19.关于Windows7中窗口的说法,以下()是正确的。 A.屏幕上只能出现一个窗口,这就是活动窗口 B.屏幕上可以出现多个窗口,但只有一个是活动窗口 C.屏幕上可以可以出现多个窗口,但不止一个是活动窗口 D.屏幕上出现的全部是活动窗口 20.在Windows7“资源管理器”的工作区中,已选定了若干个文件,若想取消其中几个选定文件,需要执行的操作是()。 A.按住Ctrl键,然后依次单击要取消的文件 B.按住Shift键,然后依次单击要取消的文件 C.按住Ctrl键,然后用鼠标右键依次单击要取消的文件 D.按住Shift键,然后用鼠标右键依次单击要取消的文件 21.Windows 7操作系统是()。 A.单用户单任务系统 B.单用户多任务系统 C.多用户单任务系统 D.多用户多任务系统 22.当窗口不能将所有的信息行显示在一屏内时,窗口中一定会出现()。 A.滚动条 B.状态栏 C.提示信息窗口 D.警告信息窗口 23.打开快捷菜单的操作为()。 A.单击 B.右击 C.双击 D.三击 24.在Windows7操作系统中,能安全关闭计算机的操作是()。 A.在文件未保存的情况下,单击“开始”按钮→“关闭”计算机 B.在保存文件并关闭所有运行的程序后,单击“开始”按钮→“关闭”计算机 C.直接按主机面板上的电源按钮 D.直接拔掉电源关闭计算机 25.将鼠标指针移至()上拖曳,既可移动窗口位置。 A.标题栏 B.格式栏 C.状态栏 D.菜单栏 26.以下输入法中属于键盘输入法的有()。 A.光电输入法 B.手写输入法 C.语音识别输入法 D.搜狗拼音输入法 27.在Windows 7操作系统中,切换输入法的快捷键默认是()。 A.Alt+Enter B.Ctrl+Alt C.Ctrl+Shift D.Alt+Shift 28.下列()文件是压缩文件。 A.财务.doc B.财务.exe C.财务.zip D.财务.txt 29.在Windows7的“资源管理器”中,关于文件扩展名的显示,以下正确的是()。 A.所有文件的扩展名始终显示,与设置无关 B.所有文件的扩展名始终不显示,是隐藏的,与设置无关 C.不可以更改扩展名是否显示的设置

多线程同步方法及比较

多线程同步方法及比较 多线程同步方法: 1.临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数 据访问。. 2.互斥量:为协调一起对一个共享资源的单独访问而设计的。. 3.信号量:为控制一个具备有限数量用户资源而设计。. 4.事件:用来通知线程有一些事件已发生,从而启动后继任务的开始。 临界区(Critical Section).. 确保在某一时刻只有一个线程能访问数据的简便办法。在任意时刻只允许一个线程对共享资源进行访问。假如有多个线程试图同时访问临界区,那么在有一个线程进入后其他任何试图访问此临界区的线程将被挂起,并一直持续到进入临界区的线程离开。临界区在被释放后,其他线程能够继续抢占,并以此达到用原子方式操作共享资源的目的。 临界区包含两个操作原语: EnterCriticalSection()进入临界区 LeaveCriticalSection()离开临界区。 EnterCriticalSection()语句执行后代码将进入临界区以后无论发生什么,必须确保和之匹配的LeaveCriticalSection()都能够被执行到。否则临界区保护的共享资源将永远不会被释放。虽然临界区同步速度很快,但却只能用来同步本进程内的线程,而不可用来同步多个进程中的线程。 MFC为临界区提供有一个CCriticalSection类,使用该类进行线程同步处理是很简单的。只需在线程函数中用CCriticalSection类成员函数Lock()和UnLock()标定出被保护代码片段即可。Lock()后代码用到的资源自动被视为临界区内的资源被保护。UnLock后别的线程才能访问这些资源。. ------------------------------------------------

相关文档
最新文档