您的位置:首页 > 编程语言 > Go语言

学习使用chromium里的线程类(1)

2015-07-02 16:31 681 查看
          Chromium就好比是一个宝藏,里面有很多宝贝。其中我最喜欢的宝贝是base库和ipc(进程间通信) 。这两件宝贝在大型项目开发中会给我们带来极大的帮助。所以值得我们去花大功夫研究、学习的。在来到我现在所在的公司前,我对chromium的了解几乎没有,那时我常常认为chromium指的就是chrome浏览器,直到所在公司在开发中大量使用了chromium里的宝贝,我才开始了解它。所在公司编码风格也完全参照google的编码风格,可想而知,上面的主管对chromium是多么的推崇。闲话少说,直入正题。

         chromium开源库里抽出来了base库下载地址:http://download.csdn.net/detail/jujueduoluo/8864601

          在学习使用thread类时,我们先来回答几个问题,为什么非得使用chromium里的线程?用他们的线程有什么好处?第一个问题回答是:“我们并不需要一定要用chromium里的线程类,一样可以写出很好的多线程程序,但是要写好多线程,需要我们操很多心,比如死锁问题;chromium里的thread类很好的解决了多线程的问题,使用起来也非常的方便”。第二个问题回答是:“正如上个问题所回答的,chromium的thread类有效解决了多线程的操心问题,因此好处是我们不用去担心那些问题”。最后借用chromium里线程概述的话来结束这一段,“我们不鼓励使用阻塞和线程安全的对象,取而代之的是,对象都只存在在一个线程中,我们在线程间传递消息。

         1)简单使用base::Thread线程类:

          每条线程都有一个 MessageLoop (base/message_loop.h)来处理线程的消息,你可以获取每个线程的MessageLoop,用这个函数就行 Thread.message_loop() 。线程间是通过抛任务的方式来通信。先把线程简单的封装下。

class SimpleThread : public base::Thread {

public:

    explicit SimpleThread(const char* name) : base::Thread(name) {

    }

   

    virtual ~SimpleThread() {

    }

    void PostTask(

        const tracked_objects::Location& from_here,

        const base::Closure& task) {

        message_loop()->PostTask(from_here, task);

    }

   

    void PostDelayedTask(

        const tracked_objects::Location& from_here,

        const base::Closure& task, int64 delay_ms) {

        message_loop()->PostDelayedTask(from_here, task, delay_ms);

    }

};

需要包含的头文件有:

#include <iostream>

#include <tchar.h>

#include "base/threading/thread.h"

#include "base/memory/scoped_ptr.h"

#include "base/bind.h"

注:在使用chromium里的base库时需要事先把base库配置好。

然后我们利用这个简单的线程类来创建一个子线程,线程名叫“简单线程”,代码如下

void Thread_Task1() {

    while (1) {

        cout << "Thread_Task1线程\n";

        ::Sleep(1000);

    }

}

int main(int argc, TCHAR * argv[]) {

    scoped_ptr<SimpleThread> thread1(new SimpleThread("线程1"));

    thread1->Start();

    thread1->PostTask(FROM_HERE, base::Bind(&Thread_Task1));

    while (1) {

        cout << "Main线程\n";

        ::Sleep(1000);

    }

    return 0;

}

运行结果如下:



我们来看看PostTask参数的含义:

tracked_objects::Location 参数:是为了满足轻量级的调试用途(task计数、正等待的task以及已完成的task都可以通过Url about:objects被监测到,当然我们需要debug版本)。一般来说,FROM_HERE 宏是这个参数的适当的值。
base::Closure参数:实际是一个Callback对象,包含了一个Run函数,这个对象被 base::Bind()函数创建,处理一个task,message_loop最终会调用 base::Closure 的 Run 函数,然后会把task 对象的引用 drops


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息