因为不会c++,今天主要是学习了一下c++的东西,感觉非常麻烦。

目前知道了c++里创建线程createThread,返回一个内核对象(HANDLE),我的理解是,c++中系统层面上的操作(线程,文件等)都是基于HANDLE。这点很奇怪。我拿c#或者java(这两个差不多)来做个比较。

c#里创建线程后,所有操作权都在Thread对象上。

 Thread t = new Thread(()=>{

     Thread.Sleep();

     Console.WriteLine("线程函数执行完毕");

 })

 t.Start();        //启动线程

 t.Suspend();   //挂起线程(这个方法已弃用,这里拿来打个比方)

 t.Abort();       //中断线程

这是很自然的面向对象思想,我们一般都这么做。

但c++提供的创建线程的函数是一个createThread,他返回的是一个HANDLE对象,我第一反应就是——卧槽,不是Thread对象吗。再一看这个对象也没有成员函数。心中一万只草泥马飞过。

上网搜了一下,HANDLE对象是内核对象,或者叫句柄,是线程的一个代表,而不是线程本身。变量名一样的存在,通过这个HANDLE对象,我可以通知系统去做一些操作,这就像是公司有个员工叫张三,大家都喊他小张,现在我是老板,有一天我看他不顺眼了,就叫人事部把小张炒了。这个例子里小张就是句柄,他代表了张三这个人,人事部是操作系统,是真正做事的人,我是老板,能管小张,就叫人事部炒了他。

所以我查到了这些函数

suspendThread(HANDLE h_thread);      //挂起线程

resumeThread(HANDLE h_thread);        //恢复挂起的线程

Sleep(long ms);                                   //阻塞当前线程一定时间,该函数阻塞的线程不会被resumeThread唤醒

terminateThread(HANDLE h_thread);     //强制退出某线程,意义相当于abort

exitThread();                                      //强制退出当前线程

getCurrentThread();                            //获取当前线程的内核对象

getCurrentThreadId();                         //获取当前线程的id

waitForSingleObject(HANDLE h_thread,long timeout);     //阻塞当前线程,等待某个线程执行完毕

waitForMultipleObject(HANDLE* h_thread[],long timeout);   //阻塞当前线程,等待多个线程执行完毕

目前的思路是在c++中提供基础的api,以下是js的函数,为了看的方便我使用数据类型标注

int createThread(fn,callback);             //创建一个线程并挂起,返回id

string suspend(int id);                      //挂起一个线程,并返回结果

string resume(int id);                       //唤醒一个线程,并返回结果

? abort(int id);                                 //中断一个线程(这里暂时不确定怎么弄,因为涉及到内存释放)

void sleep(int ms);                           //阻塞当前线程一段时间,-1为永久阻塞

string wait(int id,int ms);              //阻塞当前线程,直到等待的线程执行完毕或超时,返回结果(是超时还是执行完毕)

string waitAll(int[] ids,int ms);       //同wait,等待多个线程

bool release(int id);                      //释放c++中对线程HANDLE的引用

等于就是c++和js一一对应,js通过id告诉c++调用哪个HANDLE,c++再去调相应的函数。

现在问题在于线程被中断或js函数中异常后线程如何退出,创建的资源怎么办,线程本身的句柄是否释放。我现在在研究指针这些东西,暂时觉得指针和c#中的引用变量差不多,但需要手动delete。还有一些node c/c++ addon的东西我也还不清楚。

这篇文章就到这里了,虽然现在想到的不止这么多,但还是留到明天来写后面的部分。

node c++多线程插件 第一天 c++线程相关函数的更多相关文章

  1. node c++多线程插件 第二天 c++指针

    虽然取名叫node多线程插件,但是目前还是在学习c++的情况. 今天谈一谈c++指针. c++指针就像是c#中的引用变量,例如一个Person类的实例zs{Name="张三",Ag ...

  2. node c++多线程插件构想

    最近想写一个node的c++插件实现线程.提供的api使用回调并进行二次包装使其返回一个promise,并且要求需要在工作线程里执行的函数为async函数.如果是node7.0以下的版本,函数必须返回 ...

  3. Java多线程学习(八)线程池与Executor 框架

    目录 历史优质文章推荐: 目录: 一 使用线程池的好处 二 Executor 框架 2.1 简介 2.2 Executor 框架结构(主要由三大部分组成) 2.3 Executor 框架的使用示意图 ...

  4. 数据结构(逻辑结构,物理结构,特点) C#多线程编程的同步也线程安全 C#多线程编程笔记 String 与 StringBuilder (StringBuffer) 数据结构与算法-初体验(极客专栏)

    数据结构(逻辑结构,物理结构,特点) 一.数据的逻辑结构:指反映数据元素之间的逻辑关系的数据结构,其中的逻辑关系是指数据元素之间的前后件关系,而与他们在计算机中的存储位置无关.逻辑结构包括: 集合 数 ...

  5. ASP.NET MVC Filters 4种默认过滤器的使用【附示例】 数据库常见死锁原因及处理 .NET源码中的链表 多线程下C#如何保证线程安全? .net实现支付宝在线支付 彻头彻尾理解单例模式与多线程 App.Config详解及读写操作 判断客户端是iOS还是Android,判断是不是在微信浏览器打开

    ASP.NET MVC Filters 4种默认过滤器的使用[附示例]   过滤器(Filters)的出现使得我们可以在ASP.NET MVC程序里更好的控制浏览器请求过来的URL,不是每个请求都会响 ...

  6. Java多线程1:进程与线程概述

    进程和线程 谈到多线程,就得先讲进程和线程的概念. 进程 进程可以理解为受操作系统管理的基本运行单元.360浏览器是一个进程.WPS也是一个进程,正在操作系统中运行的".exe"都 ...

  7. C#多线程(上) 分类: C# 线程 2015-03-09 10:35 174人阅读 评论(0) 收藏

    一.多线程的相关概念 什么是进程? 当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源. 而一个进程又是由多个线程所组成的. 什么是线程? 线程是程序中的一个执行 ...

  8. 秒杀多线程第八篇 经典线程同步 信号量Semaphore

    阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇一个经典的多线程同步问题> <且不超过最大资源数量. 第三个參数能够用来传出先前的资源计数,设为NULL表示不须要传出. 注意:当 ...

  9. ios 多线程开发(二)线程管理

    线程管理 iOS和OS X中每一个进程(或程序)由一个或多个线程组成.程序由一个运行main方法的线程开始,中间可以产生其他线程来执行一些指定的功能. 当程序产生一个新线程后,这个线程在程序进程空间内 ...

随机推荐

  1. StackView的功能和用法

    StackView也是AdapterViewAnimator的子类,它也用于显示Adapter提供的系列View.SackView将会以“堆叠(Stack)”方式来显示多个列表项. 为了控制Stack ...

  2. sqlserver怎么将查询出来的数据存到新的数据库表中

    查询结果直接创建一个新表存放select * into [新表名] FROM [原表名]WHERE 车辆='小汽车' 若新建表要放在另一个数据库B中USE BGOSELECT * INTO [新表名] ...

  3. Bootstrap入门(十六)组件10:well和具有响应式特性的嵌入内容

    Bootstrap入门(十六)组件10:well和具有响应式特性的嵌入内容 well组件可以为内容增添一种切入效果. 具有响应式特性的嵌入内容可以根据被嵌入内容的外部容器的宽度,自动创建一个固定的比例 ...

  4. 新手Axis2 发布Web Service之路

    由于公司的需求,需要写几个银行接口写模拟器(Mock Server),此次接口需要发布成一个WEB Service. 一开始,我以为只要负责写接口的业务层就行了,具体的框架或是环境搭建可以不用管.在与 ...

  5. 初识Dapper

    16年年底开发一个项目,拍卖的项目,对于我这个不入流的程序员来说,雪微是个挑战.程序猿这个行业就是学到老用到老吧.个人比较喜欢sql原生的写法,对EF 还是不怎么感冒,EF 虽然强大,但是用起来还不怎 ...

  6. 基于MAC OS 操作系统安装、配置mysql

    $ sudo mv mysql-5.1.45-osx10.6-x86_64 /usr/local/mysql$ cd /usr/local$ sudo chown -R mysql:mysql mys ...

  7. [html5] 学习笔记-SVG

    1.SVG介绍:什么是SVG? 1)SVG指可伸缩矢量图形(Scalable Vector Graphics) 2)SVG用来定义用于网络的基于矢量的图形 3)SVG使用XML格式定义图形 4)SVG ...

  8. NodeJS Stream 五:双工流

    双工流就是同时实现了 Readable 和 Writable 的流,即可以作为上游生产数据,又可以作为下游消费数据,这样可以处于数据流动管道的中间部分,即 rs.pipe(rws1).pipe(rws ...

  9. JAVA构造函数的继承

    1.子类中无参构造函数,可直接继承父类中无参构造函数,前提是所有变量均为public 如下:父类Student中有空构造函数Student(),子类Pupil中有空构造函数Pupil(),后者会继承前 ...

  10. 在Ubuntu12.0至14.04版本之间用Apache搭建网站运行环境

    为了顺利安装各种软件,先更新下系统. apt-get update 安装Apache服务 apt-get install apache2 -y 安装php apt-get install php5 - ...