当前位置:文档之家› C_中跨线程访问控件问题解决方案

C_中跨线程访问控件问题解决方案

C_中跨线程访问控件问题解决方案
C_中跨线程访问控件问题解决方案

C#中跨线程访问控件问题解决方案收藏

net 原则上禁止跨线程访问控件,因为这样可能造成错误的发生,推荐的解决方法是采用代理,用代理方法来间接操作不是同一线程创建的控件。

第二种方法是禁止编译器对跨线程访问作检查,可以实现访问,但是出不出错不敢保证Control.CheckForIllegalCrossThreadCalls = false;

最近我在做一个项目,遇到了跨线程要去访问页面控件.但是总是提示出错,不能在其它线程中修改创建控件的线程的控件的值,后来采用了匿名代理,结果很轻松地解决了.解决过程如下:

首先在窗体上,创建一个listbox,lable.

using System;

using System.Collections.Generic;

using https://www.doczj.com/doc/954017390.html,ponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using System.Threading;

namespace AccessControl

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

private void Form1_Load(object sender, EventArgs e)

{

Thread newthread = new Thread(new ThreadStart(BackgroundProcess));

newthread.Start();

}

///

/// 定义一个代理

///

private delegate void CrossThreadOperationControl();

private void BackgroundProcess()

{

// 将代理实例化为一个匿名代理

CrossThreadOperationControl CrossDelete = delegate()

{

int i = 1;

while (i<5)

{

// 向列表框增加一个项目

listBox1.Items.Add("Item " + i.ToString());

i++;

}

label1.Text = "我在新线程里访问这个lable!";

listBox1.Items.Add(label1.Text);

} ;

listBox1.Invoke(CrossDelete);

}

}

}

希望这个小技巧能够对你的的学习和工作有所帮助.若有更好的办法来解决跨线程访问控件的问题,不防也拿出来大家分享一下.

C#跨线程访问控件运行时错误,使用MethodInvoker即可解决:

原代码:

private void btnOK_Click(object sender, EventArgs e)

{

tslInfo.Text = "请稍候...";

Thread td = new Thread(new ThreadStart(run));

td.Start();

}

///

/// 线程方法

///

private void run()

{

this.tslInfo.Text = "就绪";

}

修改后:

private void btnOK_Click(object sender, EventArgs e)

{

tslInfo.Text = "请稍候...";

Thread td = new Thread(new ThreadStart(threadRun));

td.Start();

}

///

/// 原线程方法

///

private void run()

{

this.tslInfo.Text = "就绪";

}

///

/// 线程方法

///

private void threadRun()

{

MethodInvoker In = new MethodInvoker(run);

this.BeginInvoke(In);

}

我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题。然而我们并不能用传统方法来做这个问题,下面我将详细的介绍。

首先来看传统方法:

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

private void Form1_Load(object sender, EventArgs e)

{

Thread thread = new Thread(ThreadFuntion);

thread.IsBackground = true;

thread.Start();

}

private void ThreadFuntion()

{

while (true)

{

this.textBox1.Text = DateTime.Now.ToString();

Thread.Sleep(1000);

}

}

}

运行这段代码,我们会看到系统抛出一个异常:Cross-thread operation not valid:Control 'textBox1' accessed from a thread other than the thread it was created on . 这是因为.net 2.0以后加强了安全机制,不允许在winform中直接跨线程访问控件的属性。那么怎么解决这个问题呢,下面提供几种方案。

第一种方案,我们在Form1_Load()方法中加一句代码:

private void Form1_Load(object sender, EventArgs e)

{

Control.CheckForIllegalCrossThreadCalls = false;

Thread thread = new Thread(ThreadFuntion);

thread.IsBackground = true;

thread.Start();

}

加入这句代码以后发现程序可以正常运行了。这句代码就是说在这个类中我们不检查跨线程的调用是否合法(如果没有加这句话运行也没有异常,那么说明系统以及默认的采用了不检查的方式)。然而,这种方法不可取。我们查看CheckForIllegalCrossThreadCalls 这个属性的定义,就会发现它是一个static 的,也就是说无论我们在项目的什么地方修改了这个值,他就会在全局起作用。而且像这种跨线程访问是否存在异常,我们通常都会去检查。如果项目中其他人修改了这个属性,那么我们的方案就失败了,我们要采取另外的方案。

下面来看第二种方案,就是使用delegate和invoke来从其他线程中控制控件信息。网上有很多人写了这种控制方式,然而我看了很多这种帖子,表明上看来是没有什么问题的,但是实际上并没有解决这个问题,首先来看网络上的那种不完善的方式:

public partial class Form1 : Form

{

private delegate void FlushClient();//代理

public Form1()

InitializeComponent();

}

private void Form1_Load(object sender, EventArgs e)

{

Thread thread = new Thread(CrossThreadFlush);

thread.IsBackground=true;

thread.Start();

}

private void CrossThreadFlush()

{

//将代理绑定到方法

FlushClient fc = new FlushClient(ThreadFuntion);

this.BeginInvoke(fc);//调用代理

}

private void ThreadFuntion()

{

while (true)

{

this.textBox1.Text = DateTime.Now.ToString();

Thread.Sleep(1000);

}

}

}

使用这种方式我们可以看到跨线程访问的异常没有了。但是新问题出现了,界面没有响应了。为什么会出现这个问题,我们只是让新开的线程无限循环刷新,理论上应该不会对主线程产生影响的。其实不然,这种方式其实相当于把这个新开的线程“注入”到了主控制线程中,它取得了主线程的控制。只要这个线程不返回,那么主线程将永远都无法响应。就算新开的线程中不使用无限循环,使可以返回了。这种方式的使用多线程也失去了它本来的意义。

现在来让我们看看推荐的解决方案:

public partial class Form1 : Form

{

private delegate void FlushClient();//代理

public Form1()

{

InitializeComponent();

}

private void Form1_Load(object sender, EventArgs e)

Thread thread = new Thread(CrossThreadFlush);

thread.IsBackground = true;

thread.Start();

}

private void CrossThreadFlush()

{

while (true)

{

//将sleep和无限循环放在等待异步的外面

Thread.Sleep(1000);

ThreadFunction();

}

}

private void ThreadFunction()

{

if (this.textBox1.InvokeRequired)//等待异步

{

FlushClient fc = new FlushClient(ThreadFunction);

this.Invoke(fc);//通过代理调用刷新方法

}

else

{

this.textBox1.Text = DateTime.Now.ToString();

}

}

}

运行上述代码,我们可以看到问题已经被解决了,通过等待异步,我们就不会总是持有主线程的控制,这样就可以在不发生跨线程调用异常的情况下完成多线程对winform多线程控件的控制了。

对于深山老林提出的问题,我最近找到了更优的解决方案,利用了delegate的异步调用,大家可以看看:

public partial class Form1 : Form

{

private delegate void FlushClient();//代理

public Form1()

{

InitializeComponent();

}

private void Form1_Load(object sender, EventArgs e)

Thread thread = new Thread(CrossThreadFlush);

thread.IsBackground = true;

thread.Start();

}

private void CrossThreadFlush()

{

FlushClient=new FlushClient(ThreadFunction);

FlushClient.BeginInvoke(null,null);

}

private void ThreadFunction()

{

while (true)

{

this.textBox1.Text = DateTime.Now.ToString();

Thread.Sleep(1000);

}

}

}

这种方法也可以直接简化为(因为delegate的异步就是开了一个异步线程): public partial class Form1 : Form

{

private delegate void FlushClient();//代理

public Form1()

{

InitializeComponent();

}

private void Form1_Load(object sender, EventArgs e)

{

Thread thread = new Thread(CrossThreadFlush);

FlushClient=new FlushClient(ThreadFunction);

FlushClient.BeginInvoke(null,null);

}

private void ThreadFunction()

{

while (true)

{

this.textBox1.Text = DateTime.Now.ToString();

Thread.Sleep(1000);

}

}

}

本文来自CSDN博客,转载请标明出处:https://www.doczj.com/doc/954017390.html,/zhongjiekangping/archive/2009/09/17/4563639.aspx

解决多线程中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);

基于多线程的高性能服务器程序的设计

基于多线程的高性能服务器程序的设计 摘要:随着网络应用的迅猛发展,高性能服务器程序越来越凸显出其重要地位。 文中基于多线程设计了高性能服务器程序,从而对处理客户端的并发请求问题提出了很好的解决方案。文中首先介绍了IOCP模型的原理,接着分别运用Select 模型和IOCP模型对高性能服务器程序的设计提出了不同的设计方法,通过比较时间、CPU的利用率和内存的使用率等参数,得出IOCP在设计服务器上提供了最佳的系统性能。最后提出了高性能服务器程序的设计方案。 关键字:Select 模型;IOCP模型;并发控制;事件;流的控制 1引言 目前很多服务器程序都是采用“一对一”处理模式,即一个客户占用一个线程,基于这种模式的服务器程序在框架上设计很简单,但是由于采用的是“一客户/一线程”的模式,所以这种服务器程序对于上千客户的请求连接,其在性能上就显得很低,在系统资源上的开销也很大。由于操作系统必须为大量的线程进行调度,从而会损耗大量的系统资源,另外互斥控制也会显得很困难,死锁发生的频率也会大幅度的增大。 现如今高性能服务器程序的设计显得越来越重要,高性能服务器程序的主要作用是能够高效的处理大量并发客户的请求,并且快速及时的处理客户的数据,同时将部分应答信息回传给客户端。要设计好一个性能优良的服务器程序,要考虑很多方面的因素,如CPU的使用率、Memory的开销等。要想做到高效处理并发用户的请求,服务器程序就需要解决两个主要的问题,一是处理并发客户的连接请求,二是对并发数据的处理。要解决这些问题,可以根据处理器内核的数量,来创建等量的工作线程,并结合IOCP(Input/Output Completion Port,IOCP))模型,以及操作系统的线程调度机制。文中采用多线程并结合IOCP模型对高性能的服务器程序设计进行了深入的探讨。 2 IOCP模型原理 IOCP(I/O Completion Port 输入/输出完成端口)是一种能够合理利用与管理多线程的机制。它是迄今为止Windows平台上最为复杂的一种I/O模型,当应用程序必须一次管理多个套接字时,完成端口模型提供了最好的系统性能,这个模型也提供了最好的伸缩性,非常适合用来处理上百、上千个客户。 IOCP模型提供了一个高效复杂的内核对象,该对象通过指定数量的线程,可

网络连接数据库

package day01; import java.sql.Connection; import java.sql.DriverManager; public class JDBCConnection { public static void main(String[] args) throws Exception { //注册驱动 Class.forName("oracle.jdbc.driver.OracleDriver"); //连接 Connection conn=DriverManager.getConnection( "jdbc:oracle:thin:@192.168.7.134:1521:orcl", "system","tarena"); System.out.println(conn); } } NetCTOSS 电信运营支撑系统 资费管理模块资费: cost/fee 主要功能: 针对资费信息的CURD(增删改查)操作. 常见的企业级应用 OSS : 运营支撑系统 CRM: 客户关系管理 ERP: 企业资源规划 技术: JavaEE开发、JavaWeb开发 JavaSE JavaEE Web技术数据库 常见的软件架构体系: (1) C/S client/server客户端/服务架构 client 需要单独安装客户端软件QQ serve 服务器端软件 优点: 客户端可以单独开发,功能和界面可以非常丰富 缺点: 软件的升级成本高 (2)B/S browser/server浏览器/服务架构 是一种特殊的c/s结构 client: 浏览器Browser IE/Firefox/chrome server: 服务器Web服务器 http协议超文本传输协议简单、无状态的协议请求request和应答response

多线程练习题目

多线程练习题目

————————————————————————————————作者:————————————————————————————————日期:

多线程? 一、单项 1.下述哪个选项为真?() A.Error类是一个RoutimeException异常 B.任何抛出一个RoutimeException异常的语句必须包含在try块之内 C.任何抛出一个Error对象的语句必须包含在try块之内 D.任何抛出一个Exception异常的语句必须包含在try块之内 2.下列关于Java线程的说法哪些是正确的?( ) A.每一个Java线程可以看成由代码、一个真实的CPU以及数据3部分组成 B.创建线程的两种方法,从Thread类中继承的创建方式可以防止出现多父类问题 C.Thread类属于java.util程序包 D.以上说法无一正确 3.哪个关键字可以对对象加互斥锁?( ) A.transient B.synchronized C.serialize D.static 4.下列哪个方法可用于创建一个可运行的类?() A.public classXimplements Runable{ publicvoid run() {……}} B.public class XimplementsThread { public void run(){……} } C. public class X implements Thread { public int run() {……} } D.publicclass X implements Runable { protectedvoidrun(){……}} 5.下面哪个选项不会直接引起线程停止执行?( ) A.从一个同步语句块中退出来 B.调用一个对象的wait方法 C.调用一个输入流对象的read方法 D.调用一个线程对象的setPriority方法 6.使当前线程进入阻塞状态,直到被唤醒的方法是() A.resume()方法 B.wait()方法 C.suspend()方法D.notify()方法 7.运行下列程序,会产生的结果是( ) publicclassXextends Thread implements Runnable { public void run(){ System.out.println(“this is run()”); } publicstaticvoid main(String[] args) { Thread t=new Thread(newX()); t.start();

数据库系统的访问

第7章数据库系统的访问 对于那些相对独立的软件供应商而言,经常要为每一个DBMS编写一个版本的应用程序,或者为每个要访问的DBMS编写针对DBMS的代码。这就意味着,大量的资源都耗在了编写和维护DB的访问上,更不用说应用程序了。此时应用程序的评价标准不再是质量,而是它能否在给定的DBMS中访问数据库。 这就需要开放的数据库连接,就是人们需要用一种新的方法来访问不同的数据库。为此,在C/S,B/S系统中必须广泛使用访问接口技术,以隐藏各种复杂性,屏蔽各种系统之间的差异。常见的数据库访问接口的技术有固有调用、ODBC、JDBC、OLE DB、DAO、ADO、https://www.doczj.com/doc/954017390.html, 以及基于XML的数据库访问等几种流行的方式。这其中以ODBC技术和JDBC技术应用最广泛,也是目前最为优秀的访问接口方式。 本章主要对几种常见的数据库访问技术(如固有调用、ODBC、JDBC、OLE DB、DAO、ADO、https://www.doczj.com/doc/954017390.html,以及基于XML的数据库访问等)进行介绍。 7.1 数据库的访问接口 所谓访问接口是指分布式环境中保证操作系统、通信协议、数据库等之间进行对话、互操作的软件系统。 访问接口的作用是保证网络中各部件(软件和硬件)之间透明地连接,即隐藏网络部件的异构性,尤其保证不同网络、不同DBMS和某些访问语言的透明性,即下面三个透明性。 ⑴网络透明性:能支持所有类型的网络。 ⑵服务器透明性:不管服务器上的DBMS是何种型号(ORACLE、SYBASE、DB2等),一个好的访问接口都能通过标准的SQL语言与不同DBMS上的SQL语言连接起来。 ⑶语言透明性:客户机可用任何开发语言进行发送请求和接受回答,被调用的功能应该像语言那样也是独立的。 应用系统访问数据库的接口方式有多种,本节介绍固有调用、ODBC和JDBC。 7.1.1 固有调用 每个数据库引擎都带有自己的包含用于访问数据库的APl函数的动态链接库DLL,应用程序可利用它存取和操纵数据库中的数据。如果应用程序直接调用这些动态链接库,就说它执行的是“固有调用”,因为该调用对于特定的数据库产品来说是“固有” (专用)的。 固有调用接口的优点是执行效率高,由于是“固有”,编程实现较简单。但它的缺点也是很严重的:不具通用性。对于不同的数据库引擎,应用程序必须连接和调用不同的专用的动态链接库,这对于网络数据库系统的应用是极不方便的。 7.1.2 ODBC ODBC是“开放数据库互连”(Open Database Connectivity)的简称。ODBC是Microsoft 公司提出的、当前被业界广泛接受的应用程序通用编程接口(API)标准,它以X/Open和ISO/IEC的调用级接口(CLI)规范为基础,用于对数据库的访问。我们可以用如下图示来说明ODBC概念。

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

. 题目用多线程同步方法解决生产者-消费 者问题(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 指导教师签名:年月日

多线程练习题目

多线程 一、单项 1.下述哪个选项为真?( ) A.Error类是一个RoutimeException异常 B.任何抛出一个RoutimeException异常的语句必须包含在try块之内 C.任何抛出一个Error对象的语句必须包含在try块之内 D. 任何抛出一个Exception异常的语句必须包含在try块之内 2.下列关于Java线程的说法哪些是正确的?( ) A.每一个Java线程可以看成由代码、一个真实的CPU以及数据3部分组成 B.创建线程的两种方法,从Thread类中继承的创建方式可以防止出现多父类问题 C.Thread类属于java.util程序包 D.以上说法无一正确 3.哪个关键字可以对对象加互斥锁?( ) A.transient B.synchronized C.serialize D.static 4.下列哪个方法可用于创建一个可运行的类?() A.public class X implements Runable { public void run() {……} } B. public class X implements Thread { public void run() {……} } C. public class X implements Thread { public int run() {……} } D.public class X implements Runable { protected void run() {……} } 5.下面哪个选项不会直接引起线程停止执行?( ) A.从一个同步语句块中退出来 B.调用一个对象的wait方法 C.调用一个输入流对象的read方法 D.调用一个线程对象的setPriority方法 6.使当前线程进入阻塞状态,直到被唤醒的方法是( ) A.resume()方法 B.wait()方法 C.suspend()方法 D.notify()方法 7.运行下列程序,会产生的结果是( ) public class X extends Thread implements Runnable { public void run(){ System.out.println(“this is run()”); } public static void main(String[] args) { Thread t=new Thread(new X()); t.start(); } }

Java第七单元练习题-Java多线程机制

7Java多线程机制 7.1单项选择题 1. 线程调用了sleep()方法后,该线程将进入()状态。 A. 可运行状态 B. 运行状态 C. 阻塞状态 D. 终止状态 2. 关于java线程,下面说法错误的是() A. 线程是以CPU为主体的行为 B. java利用线程使整个系统成为异步 C. 创建线程的方法有两种:实现Runnable接口和继承Thread类 D. 新线程一旦被创建,它将自动开始运行 3. 在java中的线程模型包含() A. 一个虚拟处理器 B. CPU执行的代码 C. 代码操作的数据 D. 以上都是 4.在java语言中,临界区可以是一个语句块,或者是一个方法,并用()关键字标识。 A. synchronized B. include C. import D. Thread 5. 线程控制方法中,yield()的作用是() A. 返回当前线程的引用 B. 使比其低的优先级线程执行 C. 强行终止线程 D. 只让给同优先级线程运行 6. 线程同步中,对象的锁在()情况下持有线程返回 A. 当synchronized()语句块执行完后 B. 当在synchronized()语句块执行中出现例外(exception)时 C. 当持有锁的线程调用该对象的wait()方法时 D. 以上都是 7. 在以下()情况下,线程就进入可运行状态 A. 线程调用了sleep()方法时 B. 线程调用了join()方法时

C. 线程调用了yield()方法时 D. 以上都是 8. java用()机制实现了进程之间的异步执行 A. 监视器 B. 虚拟机 C. 多个CPU D. 异步调用 类的方法中,toString()方法的作用是() A. 只返回线程的名称 B. 返回当前线程所属的线程组的名称 C. 返回当前线程对象 D. 返回线程的名称 语言具有许多优点和特点,下列选项中,哪个反映了Java程序并行机制的特点() A. 安全性 B. 多线程 C. 跨平台 D. 可移值 11.以下哪个关键字可以用来对对象加互斥锁?() A. transient B. synchronized C. serialize D. static 12.下面关于进程、线程的说法不正确的是( )。 A.进程是程序的一次动态执行过程。一个进程在其执行过程中,可以产生多个线程——多线程,形成多条执行线索。 B.线程是比进程更小的执行单位,是在一个进程中独立的控制流,即程序内部的控制流。线程本身不能自动运行,栖身于某个进程之中,由进程启动执行。 C.Java多线程的运行与平台无关。 D.对于单处理器系统,多个线程分时间片获取CPU或其他系统资源来运行。对于多处理器系统,线程可以分配到多个处理器中,从而真正的并发执行多任务。 7.2填空题 1.________是java程序的并发机制,它能同步共享数据、处理不同的事件。 2.线程是程序中的一个执行流,一个执行流是由CPU运行程序的代码、__________所形 成的,因此,线程被认为是以CPU为主体的行为。 3.线程的终止一般可以通过两种方法实现:自然撤销或者是__________. 4.线程模型在java中是由__________类进行定义和描述的。 5.线程的创建有两种方法:实现_________接口和继承Thread类。 6.多线程程序设计的含义是可以将程序任务分成几个________的子任务。 7.按照线程的模型,一个具体的线程也是由虚拟的CPU、代码与数据组成,其中代码与数 据构成了___________,线程的行为由它决定。 8.ava中,新建的线程调用start()方法、如(),将使线程的状态从New(新建状态)转换为 _________。 9.多线程是java程序的________机制,它能同步共享数据,处理不同事件。 10.进程是由代码、数据、内核状态和一组寄存器组成,而线程是表示程序运行状态的

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

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

题目 用多线程同步方法解决生产者-消费 者问题(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)自我评析和总结

用多线程同步方法解决生产者-消费者问题

目录 1.需求分析 (1) 1.1 课程设计题目 (1) 1.2 课程设计任务 (1) 1.3 课程设计原理 (1) 1.4 课程设计要求 (1) 1.5 实验环境 (1) 2. 概要设计 (2) 2.1 课程设计方案概述 (2) 2.2 课程设计流程图 (2) 3.详细设计 (3) 3.1 主程序模块 (3) 3.2 生产者程序模块 (4) 3.3 消费者程序模块 (5) 4.调试中遇到的问题及解决方案 (5) 5.运行结果 (6) 6.实验小结 (7) 参考文献 (7) 附录:源程序清单 (7)

1.需求分析 1.1 课程设计题目 用多线程同步方法解决生产者-消费者问题 1.2 课程设计任务 (1)每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容、 当前指针位置和生产者/消费者线程的标识符。 (2)生产者和消费者各有两个以上。 (3)多个生产者或多个消费者之间须共享对缓冲区进行操作的函数代码。 1.3 课程设计原理 生产者和消费者问题是从操作系统中的许多实际同步问题中抽象出来的具有代表性的问题,它反映了操作系统中典型的同步例子,生产者进程(进程由多个线程组成)生产信息,消费者进程使用信息,由于生产者和消费者彼此独立,且运行速度不确定,所以很可能出现生产者已产生了信息而消费者却没有来得及接受信息这种情况。为此,需要引入由一个或者若干个存储单元组成的临时存储区(即缓冲区),以便存放生产者所产生的信息,解决平滑进程间由于速度不确定所带来的问题。 1.4 课程设计要求 (1)有界缓冲区内设有20个存储单元,放入/取出的数据项设定为1~20这20个整型数。 (2)每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容、 当前指针位置和生产者/消费者线程的标识符。 (3)生产者和消费者各有两个以上。 (4)多个生产者或多个消费者之间须共享对缓冲区进行操作的函数代码。 1.5 实验环境 系统平台:LINUX 开发语言:C 开发工具:PC机一台

并发危险:解决多线程代码中的 11 个常见的问题

并发危险:解决多线程代码中的11 个常见的问题 并发危险 解决多线程代码中的11 个常见的问题 Joe Duffy 目录 数据争用忘记同步粒度错误读写撕裂无锁定重新排序重新进入死锁锁保护戳记两步舞曲优先级反转实现安全性的模式不变性纯度隔离并发现象无处不在。服 务器端程序长久以来都必须负责处理基本并发编程模型,而随着多核处理器的日益普及,客户端程序也将需要执行一些任务。随着并发操作的不断增加,有关确保安 全的问题也浮现出来。也就是说,在面对大量逻辑并发操作和不断变化的物理硬件并行性程度时,程序必须继续保持同样级别的稳定性和可靠性。 与对应的顺序代码相比,正确设计的并发代码还必须遵循一些额外的规则。对内存的读写以及对共享资源的访问必须使用同步机制进行管制,以防发生冲突。另外,通常有必要对线程进行协调以协同完成某项工作。

这些附加要求所产生的直接结果是,可以从根本上确保线程始终保持一致并且保证其顺利向前推进。同步和协调对时间的依赖性很强,这就导致了它们具有不确定性,难于进行预测和测试。 这 些属性之所以让人觉得有些困难,只是因为人们的思路还未转变过来。没有可供学习的专门 API,也没有可进行复制和粘贴的代码段。实际上的确有一组基础概念需要您学习和适应。很可能随着时间的推移某些语言和库会隐藏一些概念,但如果您现在就 开始执行并发操作,则不会遇到这种情况。本文将介绍需要注意的一些较为常见的挑战,并针对您在软件中如何运用它们给出一些建议。 首先我将讨论在并发程序中经常会出错的一类问题。我把它们称为“安全隐患”,因为它们很容易发现并且后果通常比较严重。这些危险会导致您的程序因崩溃或内存问题而中断。当 从多个线程并发访问数据时会发生数据争用(或竞争条件)。特别是,在一个或多个线程写入一段数据的同时,如果有一个或多个线程也在读取这段数据,则会发生 这种情况。之所以会出现这种问题,是因为Windows 程序(如C++ 和Microsoft .NET Framework

数据库访问方式

数据库访问的三种方式 访问数据库的方式有三种:直接访问,如访问Paradox和DBase 数据库: 通过ODBC 访问,如访问 Access、Foxpro等数据库: 通过内嵌(Native) 方式访问数据库,如访问SQLServer、 Oracle、DB2等。在Delphi中,可以使用Table控件或/和Query控件来访问数据库,二者的设置和用法部差不多,因此下面仅 Table控件为例说明这三种方式的特点和用法。 1.直接访问Delphi可以直接访问Paradox 和IDBase这两个桌面型的数据库系统。访问这两种类型的数据库时不需要特别的设置,只需要把文件路径赋给Table 控件的属性DatabaseName就可以访问该路径下的数据库了。当然,也可以事先建立映射数据库路径的数据库别名,然后把Table控件的DatabaseName属性设置为相应的数据库别名。 2. 通过ODBC访问访问Paradox和DBase以外的数据库,通常是通过ODBC来实现的Delphi 可以访问支持ODBC的数据库系统,如Access、SQLServer 和Oracle 等。 ODBC 访问数据当然,通过库时,首先要使用Windows的控制面板或Delphi的数据库引擎(BDE) 建立ODBC数据源的名称赋给Table控件的属性DatabaseName而达到访问该数据库的目的。这种方式的弊端是在程序运行时由Delphi系统自动弹出登录到数据库的英文界面的窗口,既不美观又不便于控制。因此,笔者建议在数据库应用程序中使用Database 控件来登录到数据库系统。把Table控件与Database控件关联的方法是把其DatabaseName 属性值指定为Database控件的DatabaseName属性值。个Database控件可以管理若干个Table 控件。和Database控件建立关联以后,只要该Database控件已经和数据库建立了连接,Table控件就可以直接访问数据库而无须再次登录。 3. 通过内嵌方式访问Delphi 中可以不通过ODBC,而以内嵌方式访问SQLServer、Oracle、DB2 等数据库系统。这需要使用数据库别名来指定数据库,数据库别名可以事先建立,也可以在程序运行时动态创建。前者称为静态别名,后者称为动态别名。使用数据库别名来访问数据库的方法和使用。DBC数据源的情形相同,这里不再累述。通过内嵌方式访问数据库的静态别名必须在BDE中建立。以访问SQL Server 数据库为例,在建立别名时必须指定数据库服务器的名称 (SERVER NAME) 、主机名(HOSTNAME) 以及要访问的数据库名称(DATABASE NAME) ,可以指定登录用户名(USERNAME) 和口令(PASSWORD) 等。通过动态创建的别名来访问数据库必须使用Database控件。如何设置Database控件中访问数据库的参数呢?用鼠标双击Database控件,出现参数设置窗口,在"Drivername" 栏选择要访问的数据库系统,如"MSSQL",然后选择按钮"Defaults",就会把BDE 中该数据库系统所需的参数名称和缺省值加入到"Parameteroverrides"列表中。根据实际情况更改参数中的"SERVERNAME仁"DATABASE NAME" 等工页。然后选择按钮"OK"就可以了。需要说明的两点是,以内嵌方式访问数据库需要在安装Delphi13.0时指定安装SQLLit山Query 控件的SQL语句不能以分号结尾。结论通过内嵌方式访问数据库与通过ODBC访问数据库相比,前者的速度要快些。而且,内嵌方式可以在程序中动态地设置连接数据库所需的参数,用户不必设置。DBC数据源,这就降低了对用户技术水平的要求,并且减少了用户的工作量。从系统配置的难易和复杂程度来看,使用内嵌方式开发出的数据库应用系统更便于普通用户使用。因此,笔者建议在开发较大型的应用系统时,最好通过内嵌方式来访问数据库。

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

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

目录 目录 (1) 课程设计任务书 (1) 正文 (2) 1.设计目的与要求 (2) 1.1设计目的 (2) 1.2设计要求 (2) 2.设计思想及系统平台 (2) 2.1设计思想 (2) 2.2系统平台及使用语言 (2) 3.详细算法描述 (3) 4.源程序清单 (5) 5.运行结果与运行情况 (10) 6.调试过程 (13) 7.总结 (13) 本科生课程设计成绩评定表 ..................................................... 错误!未定义书签。 课程设计任务书 学生姓名:专业班级: 指导教师:工作单位:计算机科学与技术学院 题目: 用多线程同步方法解决生产者-消费者问题(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 指导教师签名:年月日 系主任(或责任教师)签名:年月日

Java第七单元练习题Java多线程机制(20210109223217)

7 Java 多线程机制 7.1 单项选择题 1. 线程调用了sleep ()方法后,该线程将进入( )状态。 A. 可运行状态 B. 运行状态 C. 阻塞状态 D. 终止状态 2. 关于java 线程,下面说法错误的是() A. 线程是以CPU为主体的行为 B. java 利用线程使整个系统成为异步 C. 创建线程的方法有两种:实现Runnable 接口和继承Thread 类 D. 新线程一旦被创建,它将自动开始运行 3. 在java 中的线程模型包含() A. 一个虚拟处理器 B. CPU执行的代码 C. 代码操作的数据 D. 以上都是 4. 在java 语言中,临界区可以是一个语句块,或者是一个方法,并用()关键字标识。 A. synchronized B. include C. import D. Thread 5. 线程控制方法中,yield()的作用是() A. 返回当前线程的引用 B. 使比其低的优先级线程执行 C. 强行终止线程 D. 只让给同优先级线程运行 6. 线程同步中,对象的锁在()情况下持有线程返回 A. 当synchronized()语句块执行完后 B. 当在synchronized()语句块执行中出现例外( exception )时 C. 当持有锁的线程调用该对象的wait()方法时 D. 以上都是 7. 在以下()情况下,线程就进入可运行状态 A. 线程调用了sleep()方法时 B. 线程调用了join()方法时 C. 线程调用了yield()方法时 D. 以上都是 8. java 用()机制实现了进程之间的异步执行 A. 监视器 B. 虚拟机

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

题目用多线程同步方法解决生产者-消费 者问题(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.调试过程 (14) 7.总结 (14) 本科生课程设计成绩评定表 (15)

课程设计任务书 学生姓名:专业班级: 指导教师:工作单位:计算机科学与技术学院 题目: 用多线程同步方法解决生产者-消费者问题 (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 指导教师签名:年月日 系主任(或责任教师)签名:年月日

java面试题之多线程

java面试题之多线程 线程或者说多线程,是我们处理多任务的强大工具。线程和进程是不同的,每个进程都是一个独立运行的程序,拥有自己的变量,且不同进程间的变量不能共享;而线程是运行在进程内部的,每个正在运行的进程至少有一个线程,而且不同的线程之间可以在进程范围内共享数据。也就是说进程有自己独立的存储空间,而线程是和它所属的进程内的其他线程共享一个存储空间。线程的使用可以使我们能够并行地处理一些事情。线程通过并行的处理给用户带来更好的使用体验,比如你使用的邮件系统(outlook、Thunderbird、foxmail等),你当然不希望它们在收取新邮件的时候,导致你连已经收下来的邮件都无法阅读,而只能等待收取邮件操作执行完毕。这正是线程的意义所在。 实现线程的方式 实现线程的方式有两种: 1. 继承https://www.doczj.com/doc/954017390.html,ng.Thread,并重写它的run()方法,将线程的 执行主体放入其中。 2. 实现https://www.doczj.com/doc/954017390.html,ng.Runnable接口,实现它的run()方法,并将 线程的执行主体放入其中。 这是继承Thread类实现线程的示例: public class ThreadTest extends Thread { public void run() { // 在这里编写线程执行的主体 // do something } } 这是实现Runnable接口实现多线程的示例: public class RunnableTest implements Runnable {

public void run() { // 在这里编写线程执行的主体 // do something } } 这两种实现方式的区别并不大。继承Thread类的方式实现起来较为简单,但是继承它的类就不能再继承别的类了,因此也就不能继承别的类的有用的方法了。而使用是想Runnable接口的方式就不存在这个问题了,而且这种实现方式将线程主体和线程对象本身分离开来,逻辑上也较为清晰,所以推荐大家更多地采用这种方式。 如何启动线程 我们通过以上两种方式实现了一个线程之后,线程的实例并没有被创建,因此它们也并没有被运行。我们要启动一个线程,必须调用方法来启动它,这个方法就是Thread类的start()方法,而不是run()方法(既不是我们继承Thread类重写的run()方法,也不是实现Runnable接口的run()方法)。run()方法中包含的是线程的主体,也就是这个线程被启动后将要运行的代码,它跟线程的启动没有任何关系。上面两种实现线程的方式在启动时会有所不同。 继承Thread类的启动方式: public class ThreadStartTest { public static void main(String[] args) { // 创建一个线程实例 ThreadTest tt = new ThreadTest(); // 启动线程 tt.start(); } } 实现Runnable接口的启动方式:

互联网数据库网上作业客观题答案优选稿

互联网数据库网上作业 客观题答案 集团文件版本号:(M928-T898-M248-WU2669-I2896-DQ586-M1988)

一、单选题: 1.数据模型是()。 A.现实世界数据内容的抽象 B.现实世界数据特征的抽象 C.现实世界数据库结构的抽象 D.现实世界数据库物理存储的抽象 2.实际的数据库管理系统产品在体系结构上通常具有的相同的特征是()。 A.树型结构和网状结构的并用 B.有多种接口,提供树型结构到网状结构的映射功能 C.采用三级模式结构并提供两级印象功能 D.采用关系模型 3.范式是指()。 A.规范化的等式 B.规范化的关系 C.规范化的数学表达式 D.规范化的抽象表达式 4.SQL语言中,模式对应于()。 A.视图和部分基本表 B.基本表

C.存储文件 D.物理磁盘 5.SQL语言中,内模式对应于()。 A.视图和部分基本表 B.基本表 C.存储文件 D.物理磁盘 6.所谓2NF,就是()。 A.不允许关系模式的属性之间有函数依赖Y→X,X是码的真子集,Y是非主属性 B.不允许关系模式的属性之间有函数依赖X→Y,X是码的真子集,Y是非主属性 C.允许关系模式的属性之间有函数依赖Y→X,X是码的真子集,Y是非主属性 D.允许关系模式的属性之间有函数依赖X→Y,X是码的真子集,Y是非主属性 7.所谓静态元组约束,就是()。 A.规定组成一个行的各个元组之间的约束关系 B.规定组成一个元组的各个之间的约束关系 C.规定组成一个列的各个元组之间的约束关系 D.规定组成一个元组的各个行之间的约束关系

8.在数据字典中,反映了数据之间的组合关系的是()。 A.数据结构 B.数据逻辑 C.数据存储方式 D.数据记录 9.在传输表单数据时,跟在httpheader后有一专门的数据段,这个数据段包含在表单中输入的查询参数,它一起被发送给Web服务器,这种传递方法是()。 A.GET方法 B.POST方法 C.PUT方法 D.REP方法 10.构成Web超链网状结构的数据文件主要是()。 A.以INDEX编码的二进制程序文档 B.以INDEX编码的HTML文本文档 C.以HTML编码的ASCIⅡ文本文档 D.以HTML编码的二进制程序文档 二、多选题: 1.数据库管理系统是为了进行什么操作而配置的 A.数据库的建立

相关主题
文本预览
相关文档 最新文档