node c++多线程插件 第一天 c++线程相关函数
因为不会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++线程相关函数的更多相关文章
- node c++多线程插件 第二天 c++指针
虽然取名叫node多线程插件,但是目前还是在学习c++的情况. 今天谈一谈c++指针. c++指针就像是c#中的引用变量,例如一个Person类的实例zs{Name="张三",Ag ...
- node c++多线程插件构想
最近想写一个node的c++插件实现线程.提供的api使用回调并进行二次包装使其返回一个promise,并且要求需要在工作线程里执行的函数为async函数.如果是node7.0以下的版本,函数必须返回 ...
- Java多线程学习(八)线程池与Executor 框架
目录 历史优质文章推荐: 目录: 一 使用线程池的好处 二 Executor 框架 2.1 简介 2.2 Executor 框架结构(主要由三大部分组成) 2.3 Executor 框架的使用示意图 ...
- 数据结构(逻辑结构,物理结构,特点) C#多线程编程的同步也线程安全 C#多线程编程笔记 String 与 StringBuilder (StringBuffer) 数据结构与算法-初体验(极客专栏)
数据结构(逻辑结构,物理结构,特点) 一.数据的逻辑结构:指反映数据元素之间的逻辑关系的数据结构,其中的逻辑关系是指数据元素之间的前后件关系,而与他们在计算机中的存储位置无关.逻辑结构包括: 集合 数 ...
- ASP.NET MVC Filters 4种默认过滤器的使用【附示例】 数据库常见死锁原因及处理 .NET源码中的链表 多线程下C#如何保证线程安全? .net实现支付宝在线支付 彻头彻尾理解单例模式与多线程 App.Config详解及读写操作 判断客户端是iOS还是Android,判断是不是在微信浏览器打开
ASP.NET MVC Filters 4种默认过滤器的使用[附示例] 过滤器(Filters)的出现使得我们可以在ASP.NET MVC程序里更好的控制浏览器请求过来的URL,不是每个请求都会响 ...
- Java多线程1:进程与线程概述
进程和线程 谈到多线程,就得先讲进程和线程的概念. 进程 进程可以理解为受操作系统管理的基本运行单元.360浏览器是一个进程.WPS也是一个进程,正在操作系统中运行的".exe"都 ...
- C#多线程(上) 分类: C# 线程 2015-03-09 10:35 174人阅读 评论(0) 收藏
一.多线程的相关概念 什么是进程? 当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源. 而一个进程又是由多个线程所组成的. 什么是线程? 线程是程序中的一个执行 ...
- 秒杀多线程第八篇 经典线程同步 信号量Semaphore
阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇一个经典的多线程同步问题> <且不超过最大资源数量. 第三个參数能够用来传出先前的资源计数,设为NULL表示不须要传出. 注意:当 ...
- ios 多线程开发(二)线程管理
线程管理 iOS和OS X中每一个进程(或程序)由一个或多个线程组成.程序由一个运行main方法的线程开始,中间可以产生其他线程来执行一些指定的功能. 当程序产生一个新线程后,这个线程在程序进程空间内 ...
随机推荐
- Bootstrap 导航 标题栏
Bootstrap 导航 标题栏: <!DOCTYPE html> <html lang="en"> <head> <meta chars ...
- Ionic在windows下的环境配置难题
具体的配置方法网上有很多,可以参考http://my.oschina.net/JeeChou/blog/219699?fromerr=k1hPtBUs,但问题还是会有,我总结的主要有以下几个方面: 1 ...
- Apple官方IOS开发入门教程[v0.2]
今天,又跑去找IOS开发入门教程了,结果发现没什么好的PDF. 后来发现,原来苹果官方有开发入门教程,而且写的很好.所以整理出来了,给大家分享一下. 我就不在这里贴pdf的内容了,下面有苹果官方教程的 ...
- iOS 图片压缩方法
iOS 图片压缩方法 两种图片压缩方法 两种压缩图片的方法:压缩图片质量(Quality),压缩图片尺寸(Size). 压缩图片质量 NSData *data = UIImageJPEGReprese ...
- 抽象类 abstract 和 接口 interface 类的区别
在看一些框架的优秀改良时,都会设计一层base层,并且 base里面一般都是 abstract 类,然后 就找了为什么做的原因.发现: PHP5支持抽象类和抽象方法.抽象类不能直接被实例化,你必须先继 ...
- Backdoor CTF 2013: 电子取证 250
0x00 题目 h4x0r厌烦了你对他的城堡的所有攻击,所以他决定报复攻击你,他给你发来一封带有图片的邮件作为警告,希望你能找出他的警告消息:-) 消息的MD5值就是flag. 0x01 解题法1 给 ...
- 开源半成品的Web版工作流模板设计器(基于AngularJS 2和Redux), 还在继续填坑中
先上个图: 很多企业内部的应用都需要有个工作流平台(插件),无奈灵活方便好用且能够自行更改代码定制嵌入的实在不多,只好自己动手慢慢搞. https://github.com/shibamo/99-fl ...
- 正则表达式之一:TSQL注释的查找
最近自己做了个小项目,涉及到了大量的正则表达式匹配和处理,在这里也和大家分享一下. 我相信接触过SQL Server数据库的很多朋友都知道,它是以"--"开头来进行注释的,但你觉得 ...
- 背景图height:100%显示
这段时间,写移动端页面,总是遇到背景图在不同的设备上的显示拉伸问题: 本来想写百分比,可是并没有显示,又不想media@ ,换一种思路用img写 群友提供了一个办 html,body{height:1 ...
- Jenkins的新建job和配置job
这里,我们说一下如何新建并且配置一个job,Jenkins的工作其实有很多都是靠job来完成的,job有很多的功能,这里我们只介绍如何新建和配置一个建构项目的job. 新建job 新 ...