• ACE线程管理机制线程的创建与管理


    有过在不同的操作系统下用c++进行过多线程编程的朋友对那些线程处理的API可能深有体会,这些API提供了相同或是相似的功能,但是它们的API的差别却极为悬殊,十分令人头痛。

    ACE_Thread提供了对不同OS的线程调用的简单包装,通过一个通用的接口进行处理线程创建、挂起、取消和删除等问题。

    一. 线程入口函数

    所有线程必须从一个指定的函数开始执行,该函数称为线程函数,它必须具有下列原型:
    void* worker(void *arg) {}
    该函数输入一个void *型的参数,可以在创建线程时传入。
    注意:所有的线程启动函数(方法)必须是静态的或全局的(就如同直接使用OS线程API时所要求的一样)。

    二.线程基本操作

    1.创建一个线程

    一个进程的主线程是由操作系统自动生成,如果你要让一个主线程创建额外的线程,可以通过ACE_Thread::spawn()实现,该函数一般的使用方式如下:

        ACE_thread_t threadId;
        ACE_hthread_t threadHandle;

        ACE_Thread::spawn(
            (ACE_THR_FUNC)worker,        //线程执行函数
            NULL,                        //执行函数参数
            THR_JOINABLE | THR_NEW_LWP,
            &threadId,
            &threadHandle
            );

    为了简化,也可以使用其默认参数,直接使用ACE_Thread::spawn((ACE_THR_FUNC)worker) 来创建一个worker的线程。

    另外,ACE还提供了ACE_Thread::spawn_n函数来创建多个线程。

    2.终止线程

    在线程函数体中ACE_Thread::exit()调用即可终止线程执行。

    3.设定线程的相对优先级

    当一个线程被首次创建时,它的优先级等同于它所属进程的优先级。一个线程的优先级是相对于其所属的进程的优先级而言的。可以通过调用ACE_Thread::setprio函数改变线程的相对优先级,该函数的调用方式如下:
    ACE_Thread::setprio(threadHandle,ACE_DEFAULT_THREAD_PRIORITY)

    4.挂起及恢复线程

    挂起线程可以通过来实现,它能暂停一个线程的执行,其调用方式如下ACE_Thread::suspend(threadHandle)
    相应的,可以通过ACE_Thread::resume(threadHandle) 恢复被挂起的线程的执行。

    5.等待线程结束

    在主函数中调用ACE_Thread::join(threadHandle)可阻塞主函数,直道线程结束才能继续执行。

    6.停止线程

    在主函数中调用ACE_Thread::cancel (threadHandle)可停止线程的执行(在Unix底下可以,而在windows下好像不起作用,有待检验)。

    三.程序示例

    下面例子演示了如何用ace创建一个线程。

    #include "ace/Thread.h"
    #include "ace/Synch.h"

    #include <iostream>
    using namespace std;

    void* worker(void *arg)
    {
        for(int i=0;i<10;i++)
        {
            ACE_OS::sleep(1);
            cout<<endl<<"hello world"<<endl;
        }
        return NULL;
    }

    int main(int argc, char *argv[])
    {
        ACE_thread_t threadId;
        ACE_hthread_t threadHandle;

        ACE_Thread::spawn(
            (ACE_THR_FUNC)worker,        //线程执行函数
            NULL,                        //执行函数参数
            THR_JOINABLE | THR_NEW_LWP,
            &threadId,
            &threadHandle
            );
        
        ACE_Thread::join(threadHandle);

        return 0;
    }

    在这个简单的例子中,创建了1个工作者线程,执行程序中定义的worker()函数。然后阻塞主函数,待线程结束后退出程序。

  • 相关阅读:
    PHP 开发 APP 接口 学习笔记与总结
    Java实现 LeetCode 43 字符串相乘
    Java实现 LeetCode 43 字符串相乘
    Java实现 LeetCode 43 字符串相乘
    Java实现 LeetCode 42 接雨水
    Java实现 LeetCode 42 接雨水
    Java实现 LeetCode 42 接雨水
    Java实现 LeetCode 41 缺失的第一个正数
    Java实现 LeetCode 41 缺失的第一个正数
    Java实现 LeetCode 41 缺失的第一个正数
  • 原文地址:https://www.cnblogs.com/lzjsky/p/2036378.html
Copyright © 2020-2023  润新知