1. 程式人生 > >學習使用chromium裡的執行緒類(1)

學習使用chromium裡的執行緒類(1)

          Chromium就好比是一個寶藏,裡面有很多寶貝。其中我最喜歡的寶貝是base庫和ipc(程序間通訊) 。這兩件寶貝在大型專案開發中會給我們帶來極大的幫助。所以值得我們去花大功夫研究、學習的。在來到我現在所在的公司前,我對chromium的瞭解幾乎沒有,那時我常常認為chromium指的就是chrome瀏覽器,直到所在公司在開發中大量使用了chromium裡的寶貝,我才開始瞭解它。所在公司編碼風格也完全參照google的編碼風格,可想而知,上面的主管對chromium是多麼的推崇。閒話少說,直入正題。

          在學習使用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 aboutobjects被監測到,當然我們需要debug版本)。一般來說,FROM_HERE 巨集是這個引數的適當的值。 base::Closure引數:實際是一個Callback物件,包含了一個Run函式,這個物件被 base::Bind()函式建立,處理一個taskmessage_loop最終會呼叫 base::Closure 的 Run 函式,然後會把task 物件的引用 drops