因为不会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. Bootstrap 导航 标题栏

    Bootstrap 导航 标题栏: <!DOCTYPE html> <html lang="en"> <head> <meta chars ...

  2. Ionic在windows下的环境配置难题

    具体的配置方法网上有很多,可以参考http://my.oschina.net/JeeChou/blog/219699?fromerr=k1hPtBUs,但问题还是会有,我总结的主要有以下几个方面: 1 ...

  3. Apple官方IOS开发入门教程[v0.2]

    今天,又跑去找IOS开发入门教程了,结果发现没什么好的PDF. 后来发现,原来苹果官方有开发入门教程,而且写的很好.所以整理出来了,给大家分享一下. 我就不在这里贴pdf的内容了,下面有苹果官方教程的 ...

  4. iOS 图片压缩方法

    iOS 图片压缩方法 两种图片压缩方法 两种压缩图片的方法:压缩图片质量(Quality),压缩图片尺寸(Size). 压缩图片质量 NSData *data = UIImageJPEGReprese ...

  5. 抽象类 abstract 和 接口 interface 类的区别

    在看一些框架的优秀改良时,都会设计一层base层,并且 base里面一般都是 abstract 类,然后 就找了为什么做的原因.发现: PHP5支持抽象类和抽象方法.抽象类不能直接被实例化,你必须先继 ...

  6. Backdoor CTF 2013: 电子取证 250

    0x00 题目 h4x0r厌烦了你对他的城堡的所有攻击,所以他决定报复攻击你,他给你发来一封带有图片的邮件作为警告,希望你能找出他的警告消息:-) 消息的MD5值就是flag. 0x01 解题法1 给 ...

  7. 开源半成品的Web版工作流模板设计器(基于AngularJS 2和Redux), 还在继续填坑中

    先上个图: 很多企业内部的应用都需要有个工作流平台(插件),无奈灵活方便好用且能够自行更改代码定制嵌入的实在不多,只好自己动手慢慢搞. https://github.com/shibamo/99-fl ...

  8. 正则表达式之一:TSQL注释的查找

    最近自己做了个小项目,涉及到了大量的正则表达式匹配和处理,在这里也和大家分享一下. 我相信接触过SQL Server数据库的很多朋友都知道,它是以"--"开头来进行注释的,但你觉得 ...

  9. 背景图height:100%显示

    这段时间,写移动端页面,总是遇到背景图在不同的设备上的显示拉伸问题: 本来想写百分比,可是并没有显示,又不想media@ ,换一种思路用img写 群友提供了一个办 html,body{height:1 ...

  10. Jenkins的新建job和配置job

    这里,我们说一下如何新建并且配置一个job,Jenkins的工作其实有很多都是靠job来完成的,job有很多的功能,这里我们只介绍如何新建和配置一个建构项目的job. 新建job          新 ...