ThreadManager分析

类图如下:
这里写图片描述

ThreadManager是采用单例模式创建的:

ThreadManager* ThreadManager::Instance() {
  RTC_DEFINE_STATIC_LOCAL(ThreadManager, thread_manager, ());
  return &thread_manager;
}

#define RTC_DEFINE_STATIC_LOCAL(type, name, arguments) \
  static type& name = *new type arguments

把宏RTC_DEFINE_STATIC_LOCAL展开,实际上为

ThreadManager* ThreadManager::Instance() {
  static ThreadManager& thread_manager= *new ThreadManager();
  return &thread_manager;
}

但从代码中可以看出,thread_manager为静态局部变量,它在该函数第一次被调用时进行初始化(在多线程环境下是否会被多次初始化?这个有待商榷)。

ThreadManager管理着每个线程的Thread*对象,保存在线程局部对象中,当Thread ThreadManager::CurrentThread()返回到总是当前线程对应的Thread. 下面看下代码实现:

#if defined(WEBRTC_WIN)
ThreadManager::ThreadManager() {
  key_ = TlsAlloc();  //在ThreadManager构造函数中申请索引
#ifndef NO_MAIN_THREAD_WRAPPING
  WrapCurrentThread();
#endif
}

ThreadManager::~ThreadManager() {
  UnwrapCurrentThread();
  TlsFree(key_);
}

Thread *ThreadManager::CurrentThread() {
  return static_cast<Thread *>(TlsGetValue(key_));  //每个线程返回对应的Thread *
}

void ThreadManager::SetCurrentThread(Thread *thread) {
  TlsSetValue(key_, thread);  //将当前线程的Thread对象指针存入线程局部对象中
}
#endif
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要在 C++ 中编写 OpenDDS 多线程,你需要使用 OpenDDS 提供的线程库,例如 ACE 或 TAO。这些库提供了线程管理和同步功能,以便你可以在你的应用程序中创建和管理多个线程。 以下是一个简单的示例代码,演示如何在 OpenDDS 中使用多线程: ```c++ #include <dds/DCPS/Service_Participant.h> #include <dds/DCPS/WaitSet.h> #include <dds/DCPS/ThreadManager.h> class MyWorkerThread : public ACE_Task_Base { public: MyWorkerThread(const std::string& name) : name_(name) {} int svc() override { while (!this->is_stopping()) { // Do some work here... } return 0; } private: std::string name_; }; int ACE_TMAIN(int argc, ACE_TCHAR *argv[]) { // Initialize the OpenDDS service participant DDS::DomainParticipantFactory_var dpf = TheParticipantFactoryWithArgs(argc, argv); DDS::DomainParticipant_var participant = dpf->create_participant(42, PARTICIPANT_QOS_DEFAULT, 0, OpenDDS::DCPS::DEFAULT_STATUS_MASK); // Create a worker thread MyWorkerThread worker("WorkerThread1"); worker.activate(); // Wait for the worker thread to finish worker.wait(); // Cleanup participant->delete_contained_entities(); dpf->delete_participant(participant); TheServiceParticipant->shutdown(); return 0; } ``` 在上面的示例中,我们首先创建了一个 `MyWorkerThread` 类,继承自 `ACE_Task_Base`,这是一个 ACE 线程任务基类。`MyWorkerThread` 类实现了 `svc()` 方法,这是一个纯虚函数,需要你重写,以便在其中执行你的工作。 我们在主函数中创建了一个 `MyWorkerThread` 实例,并在 `activate()` 方法中启动它。然后,我们使用 `wait()` 方法等待线程完成。 最后,我们清理创建的实例,并关闭 OpenDDS 服务参与者。 这只是一个简单的示例,你可以根据你的需求自定义更复杂的多线程代码。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值