• node c++多线程插件 第一天 c++线程相关函数


    因为不会c++,今天主要是学习了一下c++的东西,感觉非常麻烦。

    目前知道了c++里创建线程createThread,返回一个内核对象(HANDLE),我的理解是,c++中系统层面上的操作(线程,文件等)都是基于HANDLE。这点很奇怪。我拿c#或者java(这两个差不多)来做个比较。

    c#里创建线程后,所有操作权都在Thread对象上。

     1 Thread t = new Thread(()=>{
     2 
     3     Thread.Sleep(2000);
     4 
     5     Console.WriteLine("线程函数执行完毕");
     6 
     7 })
     8 
     9 t.Start();        //启动线程
    10 
    11 t.Suspend();   //挂起线程(这个方法已弃用,这里拿来打个比方)
    12 
    13 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的东西我也还不清楚。

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

  • 相关阅读:
    判断鼠标在按钮区域上面
    在MFC下绘制直线,使用橡皮筋技术,可以使直线效果跟随鼠标移
    三缓冲
    MFC--自己优化滚动条的双缓冲绘图方法
    MFC视图切换大全总结
    各种线程:事件、互斥量、信号量、临界区 的用法,我自己做的,有用,附件里面有,博客附件里面有
    http://www.cctry.com/forum.php?mod=viewthread&tid=800&reltid=4131&pre_thread_id=0&pre_pos=3&ext=
    关于Mac下pycharm无法调用摄像头权限的问题
    终于理解清楚attention,利用attention对黄金价格进行预测
    tensorboard在colab中的实现
  • 原文地址:https://www.cnblogs.com/kazetotori/p/6111245.html
Copyright © 2020-2023  润新知