精华内容
下载资源
问答
  • 线程+Webservice分布式编程时需要注意的COM问题

    多线程+Webservice分布式编程时需要注意的COM问题

                                                                        老帅


        在分布式开发中,经常会使用Webservice技术,为其他应用提供服务。我们的应用在使用Delphi(这里用的是DelphiXE3,其他开发语言同理)开发时,如果需要调用Webservice接口,IDE已经提供了非常方便的方法。但有的时候,在调用Webservice的时候,我们不希望等待返回结果,要去执行其他操作。这个时候我们可以使用线程来调用Webservice,在开发过程中,发现,本来在主线程中能正常调用的Webservice接口,这个时候不能调用了,抛出了“Microsoft MSXML is not installed”异常。
      这是因为MSXML是个COM组件,一般情况下,COM组件运行在主线程中,不用考虑串行化问题。如果要在多线程中使用,要考虑串行化问题,需要显示的调用CoInitializeEx来完成对COM的初始化工作。
            
              
      //使用多线程需要注意,如果是需要共用某些可能会操作到如MSXML等涉及到COM对象的话,在线程当中需要调用
      CoInitializeEx(Nil, COINIT_MULTITHREADED);

       对于每个使用com库的线程,CoInitializeEx 至少必须调用一次, 通常也只调用一次。只要传递相同的并发标志参数,同一个线程多次调用CoInitializeEx也是允许的, 但是后面的有效调用返回S_FLASE。 要在一个线程上合理关闭com库,每一次成功调用CoInitializeEx,都必须对应调用一次CoUninitialize。
    展开全文
  • 项目开发中使用多线程优于多进程的分析   一、为什么使用多线程优于多进程: 1.创建一个线程比创建一个进程的代价要小; 2.线程的切换比进程间的切换代价小 ; 3.多线程可以充分利用多处理器 ; 4.线程间的通信比...

    什么情景下应该考虑多线程编程来解决问题

    一、为什么使用多线程优于多进程:

      1.创建一个线程比创建一个进程的代价要小;

      2.线程的切换比进程间的切换代价小 ;

     3.多线程可以充分利用多核处理器或多处理器

           请注意,对于多核处理器而言,这些额外的核对自动加快程序的速度没有任何贡献程序运行的时间将与它们在上一代硬件上的运行时间相同,除非,你编写程序时刻意利用这些额外的核如果你的程序有高度的并发性,从而能同时运行在多个核上,把运行程序的核增加一倍就可让程序的速度提高一倍。但你必须以一种不同的方式来写程序,而不再像编写标准的顺序程序那样,你需要让你自己的程序主动利用并发性。

    4 .线程越多越好吗?什么时候才有必要用多线程?
           线程必然不是越多越好,线程切换也是要开销的,当你增加一个线程的时候,增加的额外开销要小于该线程能够消除的阻塞时间,这才叫物有所值。
           Linux自从2.6内核开始,就会自动把不同的线程交给不同的核心去处理。Windows也从NT.4.0开始支持这一特性。

     5.线程间的通信比进程间的通信代价要小的多;

         5.1数据共享 :数据共享使得线程之间的通信比进程间的通信更高效;

         5.2快速响应特性 :在系统繁忙的情况下,进程通过独立的线程及时响应用户的输入;

    二、线程的几种状态

    1.  就绪(ready):线程等待可用的处理器。

    2.  运行(running):线程正在被执行。

    3.  阻塞(blocked):线程正在等待某个事件的发生(比如I/O的完成,试图加锁一个被上锁的互斥量)。

    4.  终止(terminated):线程从起始函数中返回或者调用pthread_exit。

    三、什么情景下应该考虑多线程编程来解决问题?

    1.为功能而线程化

            分配不同的线程来完成应用程序的不同功能,这是最容易的方法,因为功能重叠的机会很罕见。 在一个应用程序中控制并发功能的执行是比较容易的。 即使在计算间没有直接的影响,功能之间的依赖性还会维持。

            多线程应用举例:为了简化代码,为下列部分设计不同的线程:输入、图形用户界面、计算和输出。

    2.为性能而线程化

            通过将执行在并行环境下的大量的计算分解开来进行应用程序的并行化,能够提高计算的性能。线程化是为了改善周转周期和吞吐量 。

            比如: 搜索太空实验室碎片, 把全部搜索区域分成多个分段,并安排一个工人去搜索一个分段 。

    2.1为缩短周转周期而线程化

            用可能的最小的时间完成一个任务

            举例:安排一个饭桌时候的不同任务:

            一个侍者摆放盘子。

            一个侍者折叠和放置餐巾。

            一个侍者摆放花和蜡烛。

            一个侍者摆放器皿、汤匙、刀子和叉子

            一个侍者放玻璃杯

    2.2为了吞吐量而线程化

            在固定的时间内完成最多的任务

            举例:安排一个饭局时候的不同任务 

            对多个侍者的安排: 每个桌子安排一个侍者。 一个侍者能摆放所有桌子的所有盘子;另一个可以摆放所有的玻璃杯;以此类推。 

    展开全文
  • 多核编程与单核多线程编程

    千次阅读 2018-04-11 11:31:38
    多核编程与单核多线程编程的区别 1. 锁竞争 单核中,如果单个线程取得锁的控制权,则会获得CPU的运行时间,其它等待获取锁的线程就会阻塞。使用了锁,影响的只是加锁和解锁的耗时,CPU始终运行。 多核中,若2个...

    多核编程与单核多线程编程的区别

    1. 锁竞争

    单核中,如果单个线程取得锁的控制权,则会获得CPU的运行时间,其它等待获取锁的线程就会阻塞。使用了锁,影响的只是加锁和解锁的耗时,CPU始终运行。
    多核中,若2个(更多)线程使用同一把锁,则会导致CPU饥饿。实际还是串行化执行!

    2. 线程分解和执行的区别

    对单核CPU,对客户端软件,采用多线程,主要是创建多线程将一些计算放在后台执行,而不影响用户交互操作。(用户界面&其它计算并发执行)提高用户的操作性能!
    多核中,分解多个线程,不在限于将用户界面操作和其它计算分离。是为了让计算分配到各个CPU上执行,执行线程数量与CPU核数有关!如果线程数小于核数,某些CPU肯定处于空闲状态

    3. CPU多核负载均衡

    单核中不考虑负载均衡,各个线程计算量相差很大,也不会影响程序总计算时间。
    多核中,必须考虑将各个线程计算量均衡到各CPU上。

    4. 任务调度策略区别

    单核中,任务调度主要考虑分时,某些任务的优先执行!常用的方法有:时间片轮转,优先级抢占!
    多核中,任务调度比单核有新的需求。要考虑不同任务的耗时,和计算均衡!不能采用简单的时间片轮转和优先级抢占。而总的调用操作系统不能掌握,需要程序员实现!

    5. CPU cache存取

    CPU读取Cache时,以行为单位读取。如果2个硬件线程的两块不同内存位于同一Cache行。当2个硬件线程同时对各自的内存进行写操作,导致2个线程同时写一个Cache行。冲突!![伪内存问题]。
    单核机,不存在伪内存问题
    多核机,存在伪内存问题。想办法,使不同的内存块映射到不同的Cache行。

    6. 任务优先级抢先的问题

    单核CPU中,优先级抢占很常见的任务调度策略。
    多核CPU中,多核可导致,低优先级和高优先级的任务同时运行。需要进一步改进优先级调度策略。

    7. 串行计算,并行计算与分布式计算的区别

    单核多线程编程中,都是串行算法。用不到并行计算,更用不到分布式计算。
    多核编程中,多采用并行计算和分布式计算。

    并行计算=并行设计模式+并行算法
    分布式计算复杂度 > 并行计算的复杂度 > 串行计算复杂度

    并行计算:只考虑计算并行地执行,不考虑线程间的竞争导致CPU饥饿
    分布式计算:相比并行计算,能更好解决CPU饥饿,使计算均衡地分配任务到各内核中

    展开全文
  • 工作不是专注于Windows编程,所以用MFC多为编写小测试程序,搞个对话框,放几个控件,加上响应函数,实现功能即可。最近又写了一个测试程序,功能依然很简单,就是循环处理数据,并把处理结果输出到EditBox中。但是...

    为什么要用多线程?

    以基于对话框的MFC编程为例,若用单线程实现大量的数据处理和输出,当拖动对话框时可能会出现假死现象。因为拖动窗口会向

    线程发送窗口重绘的消息,但数据处理一直在占用CPU,而窗口重绘消息的优先级比较低,只能等数据处理完后才能被响应,此时

    虽然等待一段时间数据处理结束后也可以看到最终的输出结果,但用户体验是很差的。为了解决这一问题,可以考虑多线程。把大

    量的数据处理放入子线程执行,而主线程只处理一些可以及时响应的消息,比如输出数据,重绘窗口等。以我目前的理解,多线程

    编程主要涉及如下两个问题。

    1 线程间通信

    线程间通信主要涉及在线程间传递数据,或相互通知某些事件的完成。可采用的方法包括:

    方法1:全局变量

    方法2:发送消息

    2 线程间的同步与互斥

    多线程会涉及对共享资源或独占资源的访问,也就引入了同步与互斥的问题。

    假设多个线程都要修改同一个全局变量:

    互斥——同一时刻只能有一个线程修改该变量,但谁先处理谁后处理无所谓。

    同步——同一时刻只能有一个线程修改该变量,但其中一个线程要等待另一个线程处理完之后才能处理。

    即,同步是有先后顺序要求的互斥。

    解决互斥问题的方法包括:

    方法1:关键段Critical_Section

    方法2:事件Event

    方法3:互斥量Mutex

    方法4:信号量Semaphore

    解决同步问题的方法包括:

    方法1:事件Event

    方法2:信号量Semaphore

    展开全文
  • 线程编程需要注意的问题

    千次阅读 2017-05-21 15:26:15
    制线程是与最终用户交互的界面线程时更应如此,如果界面线程优先级较低,界面可能 较长时间没有反应,用户很可能会怀疑命令是不是还没有开始执行 多线程编程中要注意协调好各个线程的优先级。一般来说,
  • 很早以前就先写写linux下多线程编程和windows下的多线程编程了,但是每当写又不知道从哪个地方写起,怎样把自己知道的东西都写出来,下面我就谈谈linux多线程线程同步,并将它和windows的多线程进行比较,看看...
  • 编程思想之多线程与多进程(3)——Java中的多线程

    万次阅读 多人点赞 2015-06-28 20:49:35
    在程序需要同时执行多个任务,可以采用多线程。Java给多线程编程提供了内置的支持,提供了两种创建线程方法:1.通过实现Runable接口;2.通过继承Thread类。 Thread是JDK实现的对线程支持的类,Thread类本身实现了...
  • Linux/Unix编程中的线程安全问题

    千次阅读 2011-05-19 20:10:00
    在单处理器系统中,多线程通过分复用技术来技术,处理器在不同的线程间切换,从而更高效地利用系统 CPU资源。在多处理器和多核系统中,线程实际上可以同时运行,每个处理器或者核可以运行一个线程,系统的运算能力...
  •  多线程编程中,线程之间的通信是一个比较复杂的问题。大家往往搞不懂什么是竞争资源?什么时候考虑同步?怎么进行同步?什么是线程通信?怎么进行通信?很多朋友面试的时候都遇到过这样类似的一个编程题:给定一个...
  • 线程并不是越多越好,理论上,硬件支持多少线程数,就开多少个线程比较合适,有的比如完成端口IOCP中建议开2倍线程数,因为考虑到有些线程可能会挂起等情况。但最重要的一条,首先要获取当前硬件支持的线程数,通常...
  • GPU编程自学5 —— 线程协作

    千次阅读 2017-08-05 17:12:50
    深度学习的兴起,使得多线程以及GPU编程逐渐成为算法工程师无法规避的问题。这里主要记录自己的GPU自学历程。目录 《GPU编程自学1 —— 引言》 《GPU编程自学2 —— CUDA环境配置》 《GPU编程自学3 —— CUDA程序...
  • 寄存器、内存空间、全局变量、静态变量 etc.)进行写操作(读操作不会涉及线程安全的问题,不会出现数据不一致。反正,则是线程非安全(None-Thread Safe)的。 为了确保在多线程环境中的线程安全,就要确保...
  • Tcp编程下的多线程任务

    千次阅读 2016-11-08 17:30:54
    Tcp编程下的多线程任务标签(空格分隔): tcp 多线程 TCP通信为毛要引入多线程?基本 TCP 响应服务器一次只能处理一个客户端的请求。当一个客户端向一个已经被其他客户端占用的服务器发送连接请求,虽然其在连接...
  • 多核编程 与 单核多线程编程的区别

    万次阅读 2012-10-12 21:23:26
    单核中,如果单个线程取得所,则获取CPU运行时间,其他等待获取锁的线程被阻塞。使用了锁,影响的只是枷锁和解锁的耗时,CPU始终运行。 多核中,若2个(更多)线程使用同一把锁,则会导致CPU饥饿。实际还是串行...
  • 线程编程(2):线程的同步

    万次阅读 热门讨论 2010-01-10 20:18:00
    在《多线程编程》系列第一篇讲述了如何启动线程,这篇讲述线程之间存在竞争如何确保同步并且不发生死锁。线程不同步引出的问题下面做一个假设,假设有100张票,由两个线程来实现一个售票程序,每次线程运行首先...
  • 使用多线程编程的几个常见问题

    千次阅读 2011-01-04 18:43:00
    对于一个多线程编程高手来说,没有两难的选择,因为不论工作线程还是用户界面线程,其本质是完全相同的。所不同的只是用户界面线程为用户增加了消息循环机制,而使用工作线程,你自己也很容易能做到这点。由于...
  • 线程编程线程的封装

    千次阅读 2012-09-24 15:17:10
    线程考虑问题 前人总结出,一个线程安全的class应当满足三个条件: 1. 从多个线程访问,其表现出正确的行为 2. 无论操作系统如何调度这些线程,无论这些线程的执行顺序如何交织 3. 调用端代码无需额外的...
  • Linux环境编程--多线程

    千次阅读 2011-08-30 18:42:04
    本文作者: 姚继锋 (2001-08-11 09:05:00) 时隔... 居然是2001年就写了 今天看来对初学者还是很有参考意义 所以特转给大家本人在原文基础上适当修改1 引言 线程(thread)技术早在60年代就被提出,但真正应用多线
  • 《JAVA并发编程实战》——线程安全

    千次阅读 2019-03-30 20:15:05
    想要学习并发编程线程安全必须是要知道的,先给出一个线程不安全的例子吧: package com.mmall.concurrency; import com.mmall.concurrency.annoations.NotThreadSafe; import java.util.concurrent....
  • C多线程编程以及线程函数

    万次阅读 多人点赞 2017-05-12 11:25:22
    线程(thread)函数结合信号量互斥锁等的应用实例。
  • linux 网络编程之服务器多线程限制

    千次阅读 2016-07-26 20:20:25
    本文讨论服务器端多线程并发的操作和限制: 基于实验结果和百度结果: 实验基础:服务器和客户端,服务器为每个客户端连接开辟线程,验证服务器多...默认情况下,线程的资源是在主线程结束才会被回收,在线程结束
  • Java编程那些事儿100——多线程问题及处理3

    千次阅读 热门讨论 2009-05-29 10:25:00
    Java编程那些事儿100——多线程问题及处理3陈跃峰出自:http://blog.csdn.net/mailbomb12.4.3 死锁 多线程编程在实际的网络程序开发中,在客户端程序实现中使用的比较简单,但是在服务器端程序实现中却不仅是大量...
  • 线程编程线程取消

    千次阅读 2012-03-13 22:10:49
    关键: pthread_cancel函数发送...一般情况下,线程在其主体函数退出的时候会自动终止,但同时也可以因为接收到另一个线程发来的终止(取消)请求而强制终止。 2 线程取消的语义 线程取消的方法是向目标线程
  • QT多线程编程详解

    万次阅读 多人点赞 2019-04-24 22:08:20
    QT中所有的组件类和几个相关的类只能工作在GUI线程,不能工作在次线程,次线程即工作线程,主要负责处理GUI线程卸下的工作。 2、数据的同步访问 每个线程都有自己的栈,因此每个线程都要自己的调用历史和本地变量...
  • c++ 多线程编程之创建新线程

    千次阅读 2014-09-25 21:54:21
    c++语言本身没有提供多线程机制,
  • 考虑到节省系统资源,只创建了两个线程分别实现服务端的收发数据。下面直接上代码,该代码为在PC机上程序,已作详细注释。 server.c #include #include #include #include #include #include #include #incl
  • 线程编程要点

    千次阅读 2005-11-22 16:20:00
    线程编程要点线程是进程的一条执行路径,它包含独立的堆栈和CPU寄存器状态,每个线程共享所有的进程资源,包括打开的文件、信号标识及动态分配的内存等。一个进程内的所有线程使用同一个地址空间,而这些线程的...
  • 一、线程的基础知识 1.1 System.Threading.Thread类 System.Threading.Thread是用于控制线程的基础类,通过Thread可以控制当前应用程序域中线程的创建、挂起、停止、销毁。公共属性如下: 属性名称 说明 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 241,384
精华内容 96,553
关键字:

编程时如何看考虑线程问题