接触chromium已有一段时间,随便写点东西学习一下吧。
首先说一下用法,如何利用chromium封装好的thread类来开一个线程。在base里有一个封装该类的头文件thread.h,include它之后可以这样写一段代码(仅范例而已,具体用的时候要放在类里边儿的)
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所示
图1
来看看start做了些什么事情
图2
首先用Options()初始化了一些选择信息,在StartWithOptions里主要调用了PlatformThread::Create来创建该线程,在creat方法里会去调一些跟平台相关的API来创建线程,直接上代码
图3
可以很清楚的看到在平台相关的类里都是跟windows相关的代码,这句话好像是句废话,想表达的意思就是google的代码写的还是很美的,可移植性之强可见一斑,学习了。调用windows的API CreatThread后就注册了回调函数ThreadFunc,该函数体如下
这个函数其实就是利用delegate的方法再调回到类Thread的ThreadMain的方法做跟平台无关的事情,哎呀,我还得说一句,人家代码写的确实好,到时候如果我想换一个平台直接把类PlatFormThread替换掉就可以了。再来看看ThreadMain做了什么事情吧
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 }
代码有点长就不截图了。先让我简单介绍一下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
原文:http://www.cnblogs.com/zhouyoulie/p/3590168.html