首页 技术 正文
技术 2022年11月16日
0 收藏 739 点赞 5,084 浏览 1771 个字

因为不会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的东西我也还不清楚。

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

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:8,997
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,511
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,355
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,138
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,770
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,848