OSG OpenThreads 线程学习(1)

       这些天,经过对OSG OpenThreads代码的学习,在OpenThreads模块中,重点介绍了线程的操作,例如,创建线程、挂起线程、限时挂起线程等。在OpenThreads模块中,有重要的三个类:Mutex类、Condition类、Barrier类、Thread类。

一、Mutex类: 互斥类,这个类提供了一个面向对象的线程互斥对象接口,在代码中,有两种方式实现,内存的互斥访问:(1)使用临界区 USE_CRITICAL_SAECTION (2)使用原子操作。

       1.1. 在使用临界区时,首先需要定义一个临界区变量,并初始化,类实现所有的头文件为: windows.h,  代码所在的文件与类: Win32MutexPrivateData.h   Win32MutexPrivateData  Mutex, Win32Mutex.cpp

                   CRITICAL_SECTION _cs;  InitializeCriticalSection(&_cs);

       进入临界区后,实现对内存的互斥访问,访问完成后,离开临界区  :  实现线程的挂起与运行

                    EnterCriticalSection(&_cs);  tryEnterCriticalSection(&_cs);  LeaveCriticalSection(&_cs);

    tryEnterCriticalSection(&_cs) 返回类型为布尔类型 如果为FALSE:  表示线程已经获取到该临界区,或者早已获取,  如果返回TRUE: 表示另外的线程获已经获取了该临界区变量。

      在程序结束时,需要删除临界区:

                    DeleteCriticalSection(&_cs);

       1.2. 使用原子操作实现内存互斥访问,(线程的运行与挂起);首先定义变量,并初始化,  类实现的头文件: windows.h  代码所在的文件与类: Win32MutexPrivateData.h   Win32MutexPrivateData  Mutex, Win32Mutex.cpp

                 volatile unsigned long mutex;; mutex = 0;

         volatile 就象大家更熟悉的const一样,volatile是一个类型修饰符(type specifier)。它是被设计用来修饰被不同线程访问和修改的变量。

       原子操作: 0.1互换操作

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OSG中,重启全部线程需要根据具体的情况来确定如何操作。如果你的应用程序中使用了多个线程,并且需要在某个时刻重启全部线程,那么你可以考虑使用线程池来实现。 线程池是一种常用的多线程编程技术,它可以在应用程序启动时预先创建一定数量的线程,并将它们添加到一个线程池中。然后,当需要执行任务时,可以从线程池中获取一个空闲的线程来执行任务,执行完成后再把线程放回线程池中。这样可以避免频繁地创建和销毁线程,从而提高程序的性能和稳定性。 在OSG中,你可以使用`OpenThreads`库来实现线程池。`OpenThreads`是OSG中用于多线程编程的基础库,它提供了一些常用的多线程编程工具和技术,包括锁、条件变量、线程池等。下面是一个简单的示例代码,演示了如何使用`OpenThreads`库来实现线程池: ```cpp #include <iostream> #include <OpenThreads/Pool> #include <OpenThreads/ScopedLock> class MyTask : public OpenThreads::Threaded { public: void run() { while (!isTerminated()) { // 执行一些操作 } } }; int main(int argc, char** argv) { // 创建线程OpenThreads::Pool<OpenThreads::Thread>* pool = new OpenThreads::Pool<OpenThreads::Thread>(); // 启动线程池 pool->start(); // 添加任务到线程池 for (int i = 0; i < 10; i++) { MyTask* task = new MyTask(); task->setStackSize(1024 * 1024); // 设置线程堆栈大小 pool->addTask(task); } // 等待一段时间后重启线程OpenThreads::Thread::microSleep(1000000); pool->stop(); pool->join(); delete pool; // 重启线程池 pool = new OpenThreads::Pool<OpenThreads::Thread>(); pool->start(); // 添加任务到线程池 for (int i = 0; i < 10; i++) { MyTask* task = new MyTask(); task->setStackSize(1024 * 1024); // 设置线程堆栈大小 pool->addTask(task); } // 等待线程池结束 pool->stop(); pool->join(); delete pool; return 0; } ``` 在上述示例代码中,我们首先创建了一个名为`MyTask`的类,用于实现我们需要执行的线程任务。然后在`main`函数中,我们创建了一个线程池`pool`,并启动它。接着,我们向线程池中添加了一些任务,并等待一段时间后停止线程池,并销毁线程池对象。然后,我们重新创建一个线程池,并向其中添加新的任务。最后,我们等待线程池结束,并销毁线程池对象。 需要注意的是,在实际应用中,你需要根据自己的需求来设置线程池的大小和任务分配策略,并使用线程同步技术来确保线程的安全。同时,你还需要注意线程的优先级和资源占用等问题,避免对系统造成过大的负担。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值