首页 > 其他 > 详细

初识chromium thread的实现

时间:2014-03-10 16:12:07      阅读:554      评论:0      收藏:0      [点我收藏+]

  接触chromium已有一段时间,随便写点东西学习一下吧。

  首先说一下用法,如何利用chromium封装好的thread类来开一个线程。在base里有一个封装该类的头文件thread.h,include它之后可以这样写一段代码(仅范例而已,具体用的时候要放在类里边儿的) 

bubuko.com,布布扣
 1 //a sample to use base::thread of chromium
 2 //by zhouyoulie
 3 //2014.03
 4 
 5 int Fun( int para1,int para2 );
 6 
 7 //creat a thread called thread_test
 8 scoped_ptr<base::Thread> ThreadTest;
 9 ThreadTest.reset(new base::Thread("thread_test"));
10 
11 //then start it
12 if (!ThreadTest->IsRunning())
13     ThreadTest->Start();
14 
15 //use this thread to do some work which is defined in Fun
16 int para1,para2;
17 ThreadTest->message_loop()->PostTask
18 (FROM_HERE,NewRunnableMethod(this,&Fun, para1,para2));
19 
20 .....................
21 
22 //after finishing all the work,close this thread
23 ThreadTest->Stop(1000);
线程用法简介

  其实用法还是比较简单的,就是几个简单的API,大牛们封装了这么好的类,带着学习的心态,来一看究竟吧,不对的地方还求指正啊,哈哈

  该类的构造函数没有做太多事情,就是初始化了一些诸如线程名称、线程id、消息循环变量等东西,代码如图1所示

bubuko.com,布布扣

图1

  来看看start做了些什么事情  

bubuko.com,布布扣

  图2

  首先用Options()初始化了一些选择信息,在StartWithOptions里主要调用了PlatformThread::Create来创建该线程,在creat方法里会去调一些跟平台相关的API来创建线程,直接上代码

bubuko.com,布布扣

图3  

  可以很清楚的看到在平台相关的类里都是跟windows相关的代码,这句话好像是句废话,想表达的意思就是google的代码写的还是很美的,可移植性之强可见一斑,学习了。调用windows的API CreatThread后就注册了回调函数ThreadFunc,该函数体如下

bubuko.com,布布扣

  这个函数其实就是利用delegate的方法再调回到类Thread的ThreadMain的方法做跟平台无关的事情,哎呀,我还得说一句,人家代码写的确实好,到时候如果我想换一个平台直接把类PlatFormThread替换掉就可以了。再来看看ThreadMain做了什么事情吧

bubuko.com,布布扣
 1 void Thread::ThreadMain() {
 2         // The message loop for this thread.
 3         MessageLoop message_loop(startup_data_->options.message_loop_type);
 4 
 5         // Complete the initialization of our Thread object.
 6         thread_id_ = PlatformThread::CurrentId();
 7         PlatformThread::SetName(name_.c_str());
 8 //        ANNOTATE_THREAD_NAME(name_.c_str());  // Tell the name to race detector.
 9         message_loop.set_thread_name(name_);
10         message_loop_ = &message_loop;
11 
12         // Let the thread do extra initialization.
13         // Let‘s do this before signaling we are started.
14         Init();
15 
16         startup_data_->event.Signal();
17         // startup_data_ can‘t be touched anymore since the starting thread is now
18         // unlocked.
19 
20         Run(message_loop_);
21 
22         // Let the thread do extra cleanup.
23         CleanUp();
24 
25         // Assert that MessageLoop::Quit was called by ThreadQuitTask.
26         DCHECK(GetThreadWasQuitProperly());
27 
28         // We can‘t receive messages anymore.
29         message_loop_ = NULL;
30         //thread_id_ = 0;
31     }
Thread::ThreadMain()

  代码有点长就不截图了。先让我简单介绍一下message loop的概念(由于这个涉及到线程安全的问题,我打算下一次专门写点东西学习一下message loop),google采用的方式类似于微软的消息模式,你可以把message_loop_想象成一个队列,之前在介绍用这个线程封装类时,是通过函数message_loop()来post一些task到这个队列的,线程会不断到队列里去取task并执行,直到遇到一个exit task后退出,我想熟悉windows 消息模式的同学一定不会陌生。代码中的Run(message_loop_)就是开启了task 队列功能,不断去取task来完成任务。

  说到这里差不多也就结束了,下次我打算写点message loop的实现方面的东西。

     

  

初识chromium thread的实现,布布扣,bubuko.com

初识chromium thread的实现

原文:http://www.cnblogs.com/zhouyoulie/p/3590168.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!