精华内容
下载资源
问答
  • Windows多任务编程

    2012-08-08 11:19:24
    Windows多任务编程,目前一直在学习多任务编程,这份资料感觉不错,与大家共享,希望能够帮助到学习多任务编程的朋友。
  • Python程序设计教程 Python 授课教师 第9章 多任务编程 课程描述 多任务编程通常指用户可 以在同一时间内运行多个 应用程序也指一个应用 程序内可以在同一时间内 运行多个任务多任务编 程是影响应用程序性能的 重要...
  • 一步步学习Linux多任务编程

    万次阅读 多人点赞 2015-06-04 10:56:55
    02、Linux系统调用之I/O操作(文件操作)03、文件描述符的复制:dup(), dup2()多进程实现多任务04、进程的介绍05、Linux可执行文件结构与进程结构06、多进程实现多任务(一):fork()07、多进程实现多任务(二):...

    系统调用

    01、什么是系统调用?

    02、Linux系统调用之I/O操作(文件操作)

    03、文件描述符的复制:dup(), dup2()


    多进程实现多任务

    04、进程的介绍

    05、Linux可执行文件结构与进程结构

    06、多进程实现多任务(一):fork()

    07、多进程实现多任务(二):vfork()

    08、进程的控制:结束进程、等待进程结束

    09、Linux特殊进程之僵尸进程

    10、Linux特殊进程之孤儿进程

    11、Linux特殊进程之守护进程

    12、进程替换:exec函数族


    进程间通信

    13、为什么需要进程间通信?

    14、进程间通信:信号中断处理

    15、进程间通信:无名管道

    16、进程间通信:有名管道

    17、进程间通信:消息队列

    18、进程间通信:共享内存


    多线程实现多任务

    19、进程和线程的区别与联系

    20、线程的基本操作

    21、线程堆栈大小的使用介绍

    22、线程私有数据

    23、线程池


    多任务的同步与互斥

    24、什么是同步,什么是互斥?

    25、线程同步与互斥:互斥锁

    26、线程同步与互斥:读写锁

    27、线程同步与互斥:POSIX无名信号量

    28、进程同步与互斥:POSIX有名信号量

    29、进程同步与互斥:System V 信号量


    拓展进阶篇

    30、Linux 进程管理

    31、Linux 进程调度浅析

    32、浅谈进程地址空间与虚拟存储空间

    33、Linux 线程浅析

    34、Linux 信号列表

    35、浅谈可重入函数与不可重入函数

    36、浅谈标准 I/O 缓冲区

    37、I/O多路复用select、poll、epoll的区别使用


    展开全文
  • C51多任务编程思想.pdf

    2008-09-06 14:09:34
    C51多任务编程思想,资料...... C51多任务编程思想,资料...... C51多任务编程思想,资料...... C51多任务编程思想,资料......
  • 多任务编程1_Windows内核对象 多任务编程5_同步和互斥……
  • 嵌入式Linux多任务编程

    千人学习 2015-12-02 14:10:49
    本课程主要讲解Linux环境进程与线程的概述,进程创建,进程间通信编程线程编程。 学习条件: 1.C编程基础 2.Linux编程基础
  • 与很多同学交流的时候发现,一想到用C++写多线程,还是想到pthread这样的库的方法实现。 但是,十几年前的研究就证明了,线程安全...所幸的是,对于最基本的C++11多任务编程来讲,比起完整学会pthread这样的库还要容易.

    C++多任务编程简明教程 (1) - C++的多任务其实很简单

    用库的方式无法实现彻底的线程安全!我们需要C++11

    与很多同学交流的时候发现,一想到用C++写多线程,还是想到pthread这样的库的方法实现。
    但是,十几年前的研究就证明了,线程安全是无法用库的形式来提供的,有兴趣的同学可以参见原文:
    http://www.hpl.hp.com/techreports/2004/HPL-2004-209.pdf
    解释需要大量的篇幅,作为快餐式的教程,我们只讲结论。

    十几年过去了,CPU的乱序执行,编译器的乱序优化,使得通过pthread一样的库实现线程安全越来越困难。即使做到了,也是以牺牲性能为代价换来的。
    我们以java为例,虽然在java 1.0中就支持多线程了。但是,真正完整的线程安全的基础设施的完成是在java 5.0版本中才实现的。这其中最重要的一点,就是java 5.0明确定义了内存模型。有了内存模型的保证,我们才真正知道,什么是可行的,什么是不可行的。如何定义才能在多线程中实在可见性。
    在有较大影响的语言中,java是率先达到了这一目标的。C++在当时基本上没有为多线程或者多任务做过考虑,这个问题直到C++11中才被解决掉。

    所以,至少对于多线程编程来讲,C++11是必须要学习的。我们不能再停留在C++98/03的老黄历上了!
    所幸的是,对于最基本的C++11多任务编程来讲,比起完整学会pthread这样的库还要容易.

    多任务优于多线程

    然后,我们从C++11的线程开始讲?不,我宁愿把整个内存模型讲完了之后才教您如何使用线程,就怕学完了线程没学内存模型就上手直接开始用了,导致遇到问题之后才知道内存模型的重要性。

    但是,这还不是我最想讲的,为什么要学线程和内存模型呢?大部分的任务,我们根本不需要了解什么是线程,什么是锁,更不用说无锁编程之类的了。看过我的《Java多线程编程简明教程(1) - Future模式与AsyncTask》都知道,如果有更简单、更高级的封装,我是不建议先学更低级的工具的。

    为什么需要多线程?其实很多同学没有意识到,需要的只是多任务,线程只是手段。线程是操作系统级的概念,是操作系统级的资源,我们要管理到这么细节,就得去处理比如管理线程状态,处理线程数满了的异常,如何做线程的负载均衡之类的管理工作,而这些根业务逻辑之间没有半毛钱关系。

    从java的发展来看,5.0提供了Future模式,7.0中提供了Fork-Join模式,封装得越来越高级。C++11中暂时还没有到Fork-Join这么高级,不过,直接调用一个std::async函数就可以实现Future模式.

    所谓的Future模式,就是在后台起一个任务,然后前台该干嘛干嘛,等到前台任务需要用到刚才的后台任务的时候,再去获取后台任务的结果。如果后台任务已经结束了,自然是最好,继续干活就是了。即使后台还没做完,至少也能少等一会儿。不管怎么样都不赔。

    std::async 快餐

    C++11如何去做一个后台任务呢,实在太简单了,写个函数,或者仿函数,或者是lambda表达式这样可以被调用的逻辑,然后通过std:async去调用就是了。

    唯一需要注意的一点,future模式不允许共享内存,复制一份只读的通过参数传给你的函数吧。

    太简单了,一共就只需要4步:
    * 引入头文件
    * 写需要后台执行功能的函数
    * 通过async函数调用上面写的函数
    * 主任务继续干活
    * 需要后台任务的结果时,去读它的返回值

    引入future头文件

    #include <future>

    实现功能的函数

    将后台要做事儿的逻辑写成一个函数吧,这里写个最简单的:

    void func1(int arg){
        cout<<"I am running in background!"<<arg<<endl;
    }

    通过async调用您的逻辑

        future<void> f1 = async(launch::async,func1,0);

    大家可以看到,async有多么的简单,第一个参数是马上就启动后台任务,还是用的时候再启动。我们一般都是希望马上启动,于是固定地给launch::async就好了。真的有特殊需求要用的时候再启动,就给launch::deferred。只有这两种情况,简单吧?
    第二个参数就是刚才写好的后台逻辑的函数。第三个是您的函数要用的参数。

    返回一个future,类型与刚才您写的函数的返回值一致。这时候不需要知道它是什么。

    甚至有个更绝情的办法,我们根本不care返回值是什么,直接给个auto让编译器自己推断去。
    像下面这样:

        auto f1 = async(launch::async,func1,0);

    不需要懂任何跟线程相关的知识吧?

    主任务继续干活

    这个就不多说了,既然要起后台任务,前台肯定有事儿要做。

    获取后台的值

    到了需要返回值的时候,直接调用get函数。本例中是void类型,所以返回值获取了我们也不用。

        f1.get();

    OK,我们的快餐教程就讲完了,不需要懂什么是线程,什么是锁,什么是内存模型,原子变量是什么,内存都有什么顺序之类的。大家可以快乐地去干活去了~ 等将来我们详详细细地把刚才列举的这些知识一一补齐,大家就会发现这其实是有多复杂了。

    例子

    Java历史上借鉴了太多的C++的东西,但是内存模型和Future模式这些,Java是领先于C++的。
    那我们向Java致敬吧,将Java多线程简明教程中Future模式的例子用C++改写一下。我们看看C++的优势吧:

    public class AsyncTaskSimple {
        public static class Result implements Callable<String>{
            @Override
            public String call() throws Exception {
                return doRealLogic();
            }
    
            private String doRealLogic(){
                //Here to do the background logic
                return new String("Done");
            }
        }
        public static void main(String[] args) {
            FutureTask<String> future = new FutureTask<String>(new Result());
            ExecutorService executor = Executors.newFixedThreadPool(1);
            executor.submit(future);
            someThingToDo();
            try {
                String s = future.get();
                System.out.println("The result is:"+s);
            }catch (InterruptedException e){
                //Deal with InterruptedExcpeiotn
            }catch(ExecutionException ee){
                //Deal with ExecutionException
            }
        }
    
        private static void someThingToDo(){
            //Main thread logic
        }
    }

    Java写了这么一大坨,C++11只用不到一半的篇幅就搞定了:

    string doRealLogic(){
        return string("Done");
    }
    void someThingToDo(){
        //do something
    }
    int main(int argc, char** argv)
    {
        auto f2 = async(launch::async,doRealLogic);
        someThingToDo();
        cout<<f2.get()<<endl;
    }

    或者我们更现代一点,也不要写函数了,直接上一个lambda表达式吧。

    void someThingToDo(){
        //do something
    }
    int main(int argc, char** argv)
    {
        auto f2 = async(launch::async,[](){
            return string("Done");
        });
        someThingToDo();
        cout<<f2.get()<<endl;
    }

    最后再强调一遍,输入参数通过函数参数传进去,输出参数通过返回值,也就是future.get获取回来。不要使用全局变量等方式来共享内存!

    Enjoy it!

    展开全文
  • linux多任务编程wait()函数基础实验,下载下来直接编译就可以了
  • RTOS环境下多任务编程要点

    千次阅读 2014-04-05 17:39:53
    RTOS环境下多任务编程要点 一. 分析阶段 1. 需求分析,予以文档描述; 2. 一些初始化问题,探究需求分析中的关键点; 3. 解决时序问题,系统中算法的分析; 4. 决定使用RTOS,依赖于时间响应和任务数量;...

    RTOS环境下多任务编程要点

    一.   分析阶段

    1.  需求分析,予以文档描述;

    2.  一些初始化问题,探究需求分析中的关键点;

    3.  解决时序问题,系统中算法的分析;

    4.  决定使用RTOS,依赖于时间响应和任务数量;

    5.  划分任务,确定系统所需的任务和模块;

    6.  系统间通信,消息机制是最优的方法之一;

    7.  共享数据处理,创建独立的模块;

    8.  结论,绘制系统设计图。

    二.   编码实现

    1.  系统组成的基本单元是模块,即单个的C源文件,它封装了数据与程序;

    2.  模块之间交互通过调用函数来实现,没有使用任何全局变量;

    3.  防止竞态发生的手段是信号量;

    4.  非立即获取的数据由回调函数予以处理;

    5.  向任务发送消息的方法封装在“外壳”函数之中;

    6.  所有模块调用的函数原型全部组织在一个头文件之中;

    7.  模块中都有初始化函数,负责任务创建、初始化信号量和队列等,并由main()主函数统一调用。

    三.   防止竞态(以下任务包括ISR)

    1.  竞态只可能发生在全局的资源上(硬件/全局变量/静态变量),而像任务的私有资源(仅被自己访问)和堆栈数据是不可能发生竞态的;

    2.  一个函数被哪个任务调用,它就代表该任务的访问行为,与该函数定义位置无关(回调函数是最让人迷惑的,它定义在A任务中,但它被任务B调用,所以它代表任务B的访问行为);

    3.  凡是被多个任务访问(包括读/写)的资源,必定发生竞态;

    4.  需要保护的共享资源必须确保在使用范围之内都是处于保护状态;

    5.  保护的手段:禁止/启用IRQ、禁止/启用任务调度、信号量。

    四.   线程通信

    方式一 实时操作系统中任务通信的经典方式是:任务阻塞在等待消息上,直到中断服务程序或者其他任务给自己发送消息。如:

        void TaskA(void)

        {

          while (FOREVER)

             {

               OSQPend(p_QData, 0, &err);  /* waiting for events */

            /**** deal with received events ****/

             }     

        }

      当其他任务向自己发送消息时,把该消息封装在“外壳函数”中,这样可以避免使用全局变量,同时增加了安全性:

        void taska_SendPrompt(Int IMsg)

        {

             assert(IMsg >= MIN_VAL && Imsg <= MAX_VAL);

          OSQPost(p_QData, (void *)IMsg);

    }

     

    方式二结合邮箱和信号量可以让任务进行更高级的通信方式,如下代码所示,任务A先创建一信号量,绑定信号量和它希望任务B所做的事情到消息中,再投递该消息到邮箱,然后在信号量上进行等待,当结束等待时说明任务B已经干完该事情,则删除信号量。

        void TaskA(void)

    {

      msg.sem = CreateSemaphore(0);

      msg.func = TaskAFunc;

      PostMBox(mbox, &msg);  /* tell TaskB do something */

      WaitSemaphore(msg.sem);  /* waiting until TaskB done */

      FreeSemaphore(msg.sem);

        }

    任务B首先在邮箱上等待,当接收到消息后调用函数,完成任务A希望它干的事情,再释放信号量通知任务A工作完毕。

    void TaskB(void)

    {

      msg = PendMBox(mbox);

      msg.func(&msg);  /* do something that TaskA desired */

      SignalSemaphore(msg.sem);  /* tell TaskA thing is done */

        }

    五.   线程共享

    1)简单共享,如图1所示,任务A写数据块DataStructure后给任务B发送消息,任务B提取消息并从任务A复制数据块DataStructure到自己的数据区TaskBData中。

    优点:简单,容易实现,适合于慢速通信。

    缺点:①任务B如果响应速度不够快则有可能任务A又改写了数据块而发生错误(Write两次,Read一次);②DataStructure同时被任务A和任务B访问,为防止“竞态”错误需要进行保护。

    图1 简单共享

     

    2)抽象成数据模块,加信号量予以保护,如图2所示。

    优点:简单,安全,模块化,适应于被多个任务共享的数据。

    缺点:①任务可能会在该信号上阻塞很长时间;②任务为了方便操作数据一般会建立自己的副本,这样一来占用更多的数据存储区。

    图2  带信号量的数据模块

     

    3)回调函数,如图3所示,任务A把自己的回调函数传递给任务B的消息队列中,任务B从队列中提取并调用该函数,此时回调函数即可以访问任务B的数据,又可以访问任务A的数据,给编程带来极大的自由度。

    优点:自由灵活,如任务A和任务C对任务B中的数据进行不同的运算,只需要修改任务对应的回调函数即可,特别适应于任务中数据被多个其他任务使用且运算方式不同的场合。

    缺点:①较为复杂,需要清晰了解回调函数的数据流才能正确使用;②回调函数定义在任务A但被任务B使用,它就代表任务B的行为,这样一来TaskAData就被任务A和任务B(通过TaskACallback)共享,为避免“竞态”带来错误,需要对TaskAData进行保护(参见上述三),同理,TaskCData也需要进行保护。

    图3 回调函数

     

    4)生产者与消费者队列,如图4所示,任务A把“生产”的数据存入RingBuffer中,再将该数据的指针传递给任务B的消息队列中,任务B提取该数据的指针后从RingBuffer复制数据到TaskBData中。

    优点:简单可靠,适应于尺寸相同且“生产”速率恒定的场合。

    缺点:①对数据尺寸有限制,必须是相同大小的数据才能建立RingBuffer(循环缓冲区);②“生产“速率必须恒定且RingBuffer的大小设置合理,才能确保不会发生“溢出”错误。

    图4 生产者与消费者队列

     

    5)动态生成消息,如图5所示,任务A动态生成(常见为malloc())消息msg,将该消息指针传递到任务B的消息队列中,任务B提取并处理该消息后,释放(常见为free())该消息所占用的内存。

    优点:适用于多任务之间进行自由通信,消息类型和大小都不受限制。

    缺点:①较复杂,消息类型可能会非常多,需要较好她组织;②因为动态分配和释放内存,需要细心设计,小心内存泄露;③动态分配内存时间不可控,对于实时性要求特别高的任务需要考虑这个限制。

    图5 动态生成消息

    展开全文
  • 【博文汇总】linux下多任务编程

    千次阅读 2013-11-27 08:52:13
    【博文汇总】linux下多任务编程 [Linux的多任务编程-基本概念]介绍了多任务处理的基本知识,主要讲解了基于进程和线程实现多任务处理的不同特点和区别.基于进程的多任务编程 [Linux的多任务编程-进程]介绍了进程的...

    【博文汇总】linux下多任务编程

    概述

    [Linux的多任务编程-基本概念]介绍了多任务处理的基本知识,主要讲解了基于进程和线程实现多任务处理的不同特点和区别.

    基于进程的多任务编程

    [Linux的多任务编程-进程]介绍了进程的基本概念,创建,中止和退出等,同时也介绍了fork,vfork函数和进程间文件描述符的共享.

    [深入浅出进程与线程的基本概念]进程和线程是操作系统的基本概念,但是它们比较抽象,不容易掌握.这篇文章中的类比可以把它们解释地清晰易懂.

    基于线程的多任务编程

    [Linux的多任务编程-线程]介绍了线程的基本概念,创建,终止和基本属性.

    [linux的多任务编程-线程池]介绍了一种多任务处理的解决方案:线程池,具有很好的参考价值.

    [Linux下多任务间通信和同步-概述]简单概述了linux下进行多任务处理,任务间通信和同步的方法.

    多任务间的数据通信方法

    [Linux下多任务间通信和同步-管道]进程间通信方法,介绍了匿名管道和有名管道(FIFO).

    [Linux下多任务间通信和同步-信号]进程间通信方法,介绍了信息了产生,发送和处理,以及信号集.更加深入的分析,可以阅读"linux内核中的信号机制"系列文章.

    [Linux下多任务间通信和同步-消息队列]进程间通信方法,介绍了消息队列的创建,消息的发送和接收.

    [Linux下多任务间通信和同步-mmap共享内存]进程间通信方法,主要讲解了mmmap,munmap和msync三个系统调用.

    [Linux下多任务间通信和同步-System V共享内存]进程间通信方法,共享内存的另一种实现.

    多任务间的同步方法

    [Linux下多任务间通信和同步-System V信号量]进程间共享资源访问控制机制.

    [Linux下多任务间通信和同步-POSIX信号量]线程间共享资源访问控制机制,当然也可以用于进程间,当调用sem_init时,设置了pshared=1的话,那么(地址空间)拷贝的时候,信号量(sem_t类型的变量)就不会复制成两个而是作为两个进程的共享.(这个好像有点问题,pshared这个参数受版本影响,传递一个非零将会使函数调用失败”)不过,在无血缘关系的进程中,可以把信号量放在共享内存中.

    [Linux下多任务间通信和同步-互斥锁]线程间共享资源访问控制机制.

    [Linux下多任务间通信和同步-条件变量]线程间共享资源访问控制机制.

    展开全文
  • Linux的多任务编程-基本概念

    千次阅读 2013-09-16 06:36:17
    Linux的多任务编程-基本概念概述 当操作系统使用某种策略允许两个或更多进程并发共享一个CPU时,它称作多任务运行,或多道程序运行.在规定的时间片过期或某些事件发生前,一直执行某个进程.然后,操作系统切换到另一个...
  • 多任务的概念人们已经非常熟悉了,它是指用户可以在同一时间内运行多个应用程序。Linux就是一种支持多任务的操作系统,它支持多进程、多线程等多任务处理和任务之间的多种通信机制。 Linux下多任务机制的介绍 ...
  • vxWorks多任务编程初探-上

    千次阅读 多人点赞 2011-07-08 10:35:51
    1、多任务:为满足真实世界事件的异步性,现代操作系统需提供多任务支持,由系统内核分配CPU给多个任务并发执行。如果是单CPU,则执行方式实质是宏观并行、微观串行; 2、任务调度:真实世界的事件具有继承的优先级...
  • Linux下多任务介绍  首先,先简单的介绍一下什么叫多任务系统?任务、进程、线程分别是什么?它们之间的区别是什么?,从而可以宏观的了解一下这三者,然后再针对每一个仔细的讲解。  什么叫多任务系统?多任务...
  • Linux多任务编程(六)---编写多进程程序及其代码

    万次阅读 多人点赞 2013-06-10 09:19:03
     通过编写进程程序,熟练掌握fork()、exec()、wait()和waitpid()等函数的使用,进一步理解在Linux中进程编程的步骤。 实验内容  该实验有3个进程,其中一个为父进程,其余两个是该父进程创建的子进程,其中一...
  • .NET多线程编程(1):多任务和多线程 在.NET多线程编程这个系列我们讲一起来探讨多线程编程的各个方面。首先我将在本篇文章的开始向大家介绍多线程的有关概念以及多线程编程的基础知识;在接下来的文章中,我将逐一...
  • 同步是一种更为复杂的互斥,而互斥是一种特殊的同步。也就是说互斥是两个任务之间不可以同时运行,他们...因此互斥具有唯一性和排它性,但互斥并不限制任务的运行顺序,即任务是无序的,而同步的任务之间则有顺序关系。
  • NET多线程编程(1):多任务和多线程

    千次阅读 2006-05-29 11:13:00
    在.NET线程编程这个系列我们讲一起来探讨线程编程的各个方面。首先我将在本篇文章的开始向大家介绍线程的有关概念以及线程编程的基础知识;在接下来的文章中,我将逐一讲述。NET平台上线程编程的知识,诸如...
  • Tcp编程下的线程任务

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

    千次阅读 2015-08-18 09:56:03
    现代操作系统基本都是多任务操作系统,即同时有大量...这两种情形是多任务编程中遇到的最基本的问题,也是多任务编程中的核心问题,同步和互斥就是用于解决这两个问题的。 互斥:是指散步在不同任务之间的若干
  • C#线程编程笔记(4.1)-使用Task任务

    千次阅读 2018-06-26 09:51:12
    近来在学习Eugene Agafonov编写的《C#线程编程实战》(译),做些笔记也顺便分享一下^-^任务(Task)是什么?首先我们先了解一个概念, .Net Framework4.0引入了一个新的关于异步操作的API,叫任务并行库(Task ...
  • Java线程编程

    万次阅读 2016-06-17 22:08:38
    多线程是多任务的一种特别的形式。多线程比多任务需要更小的开销。 这里定义和线程相关的另一个术语:进程:一个进程包括由操作系统分配的内存空间,包含一个或多个线程。一个线 程不能独立的存在,它必
  • 线程编程

    千次阅读 2005-05-03 01:24:00
    线程编程☆ 关于线程的一些细节☆ 用VC实现线程的调度和处理☆ 用VC实现线程☆ 线程编程技术及其实现☆ C#的线程 机制探索☆ C#线程编程实例实战 ☆ DELPHI下的线程程序设计☆ VC++环境下利用管道和...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 648,404
精华内容 259,361
关键字:

多任务编程