- 1、本文档共542页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第7章 进程与线程 7.3 多线程同步 7.3 多线程同步 7.3.1 加锁(lock) 7.3.2 监视器(Monitor) 7.3.3 互斥体(Mutex) 7.3.1 加锁(lock) class ThreadUnsafe { static int _val1 = 1, _val2 = 1; static void Go() { if (_val2 != 0) Console.WriteLine(_val1 / _val2); _val2 = 0; } } 代码有没有问题? 此时的类不是线程安全的。如果Go()方法同时被两个线程调用,可能会发生除数为0的错误。因为可能一个线程刚好执行完if的判断语句,但还没执行Console.WriteLine语句,另一个线程将_val2赋值为0。 7.3.1 加锁(lock) class ThreadUnsafe { static int _val1 = 1, _val2 = 1; static void Go() { if (_val2 != 0) Console.WriteLine(_val1 / _val2); _val2 = 0; } } class ThreadSafe { readonly object _locker = new object(); static int _val1, _val2; static void Go() { lock (_locker) { if (_val2 != 0) Console.WriteLine(_val1 / _val2); _val2 = 0; } } } 7.3.1 加锁(lock) lock语句能够确保同一时间只有一个线程进入执行。就像服装店的试衣间一样,当一个顾客进去试衣间时锁上门,其他顾客必须等他出来之后才能进去。 lock语句的语法规则如下: lock(expression) statement-block 在这个例子中,我们保护的是Go()方法的内部逻辑,还有_val1与_val2字段。如果有线程A和线程B执行Go()方法,第一个执行Go()的线程A,成功获取_locker的锁定,执行程序。而线程B要等待线程A执行结束后,释放_locker的锁定,线程B才能执行。 7.1.2 进程类(Process) 表7-1 Process类的常用属性 属性 说明 BasePriority 获取关联进程的基本优先级。 Handle 获取关联进程的本机句柄。只有Process对象启动了进程,该属性才有效。 HandleCount 获取由进程打开的句柄数。当HandleCount等于0时,操作系统才会释放句柄及其关联数据。 Id 获取关联进程的唯一标识符。 MainModule 获取关联进程的主模块。 Modules 获取已由关联进程加载的模块。 MainWindowHandle 获取关联进程主窗口的窗口句柄。 MainWindowTitle 获取进程的主窗口标题。 ProcessName 获取该进程的名称。 StartInfo 获取或设置要传递给Process的Start方法的属性。 StartTime 获取关联进程启动的时间。 Threads 获取在关联进程中运行的一组线程。 7.1.2 进程类(Process) 表7-2 Process类的常用方法 方法 说明 GetCurrentProcess() 静态方法,获取新的Process对象并将其与当前活动的进程关联。 GetProcessById() 静态方法,通过进程Id获取Process对象,这个对象与指定Id的进程资源关联。 GetProcesses() 静态方法,为每个进程资源创建一个新的Process对象,返回值为Process类型的数组。 GetProcessesByName() 静态方法,通过进程名称获取Process对象,并将它们与指定的进程名称的所有进程资源关联。 Start() 启动一个进程资源,并与一个Process对象关联。 Kill() 立即停止关联的进程。 CloseMainWindow() 通过向进程的主窗口发送关闭消息来关闭拥有用户界面的进程。 WaitForExit() 指示Process对象在指定的毫秒数内等待关联进程退出。 7.1.3 进程的控制 1.启动和停止进程 使用Process类启动一个进程分为3步: 创建Proces
文档评论(0)