因为不会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的东西我也还不清楚。
这篇文章就到这里了,虽然现在想到的不止这么多,但还是留到明天来写后面的部分。