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方法的线程开始,中间可以产生其他线程来执行一些指定的功能. 当程序产生一个新线程后,这个线程在程序进程空间内 ...
随机推荐
- Java线程:线程中断
interrupt方法可以用来请求终止线程. 当对一个线程调用interrupt方法时,线程的中断状态被置位.这时每个线程都有boolean标志.每个线程都应该不时的检查这个标志,以判断线程是否被中断 ...
- C语言中strcpy,strcmp,strlen,strcat函数原型
//strcat(dest,src)把src所指字符串添加到dest结尾处(覆盖dest结尾处的'\0')并添加'\0' char *strcat(char * strDest, const char ...
- Spring classPath:用法
http://blog.csdn.net/xing_sky/article/details/8228305 参考文章地址: http://hi.baidu.com/huahua035/item/ac8 ...
- Nancy简单实战之NancyMusicStore(六):写在最后
前言 由于公司搬家后,住的地方离上班的地方远了N倍,以前是走路十多分钟就可以到公司的,上班时间也从9:00提早到8:30 现在每天上班都是先坐公交,然后再坐地铁,在这段路上比较浪费时间而且每天都是要6 ...
- .net判断System.Data.DataRow中是否包含某列
大家对将DataRow转成实体对象并不陌生,转成实体的时候一般都会加上这个判断 if (row["字段名"] != null && row["字段名&q ...
- 【js 编程艺术】小制作二
首先是一个html文档 /* explanation.html */<!DOCTYPE html> <html> <head> <meta charset=& ...
- JS与浏览器的几个兼容性问题
第一个:有的浏览器不支持getElementsByClassName(),所以需要写一个function()来得到需要标签的class,然后进行class的增加.删除等操作. 第二个:在需要得到特定标 ...
- vue-router跳转页面
小结放在前:先祝大家新年快乐!鸡年大吉大利!在新的一年里大家都有跳跃般的成长!作为新年的第一篇文章,就拿他来给大家拜个年!!!文章前部份讲解了vue-router路由的配置,后半部分为去年的文章vue ...
- (@WhiteTaken)设计模式学习——简单工厂
最近工作比较忙,所以没有怎么写博客,这几天将集中学习一下(厉风行)讲解的设计模式的相关知识,并对主要的代码进行介绍. 言归正传,接下来介绍最简单也是最基础的简单工厂设计模式. 什么是简单工厂? 简单工 ...
- mybatis入门-mapper代理原理
原始dao层开发 在我们用mybatis开发了第一个小程序后,相信大家对于dao层的开发其实已经有了一个大概的思路了.其他的配置不用变,将原来的test方法,该为dao的方法,将原来的返回值,直接在d ...