pthread once與執行緒安全的單例模式

2021-07-14 22:36:49 字數 1211 閱讀 2361

在單例模式的class設計的時候,常常會看到一種寫法:

if(***==null)

return ***;

}

這個辦法叫做double check locking(縮寫為dcl)。在《linux多執行緒服務端》一書中,作者提出dcl已經靠不住,並提出了使用pthread_once來實現單例的執行緒安全。

#include 

int pthread_once(pthread_once_t *once_control, void (*init_routine) (void));

在多執行緒環境中,有些事僅需要執行一次。通常當初始化應用程式時,可以比較容易地將其放在main函式中。但當你寫乙個庫時,就不能在main裡面初始化了,你可以用靜態初始化,但使用一次初始化(pthread_once)會比較容易些。

在多執行緒程式設計環境下,儘管pthread_once()呼叫會出現在多個執行緒中,init_routine()函式僅執行一次,究竟在哪個執行緒中執行是不定的,是由核心排程來決定。

#include

#include

#include

using

namespace

std;

pthread_once_t once = pthread_once_init;

void once_run(void)

程式執行後,執行緒中指定函式部分在兩個子執行緒中出現,不過只執行一次。

使用pthread_once來保護物件申請,來保證「單例」,及時在多執行緒的情況下,這是muduo庫作者的思路。

**如下:

//muduo/base/singleton.h

template

class singleton : boost::noncopyable

private:

singleton();

~singleton();

static

void init()

}static

void destroy()

private:

static pthread_once_t ponce_;

static t* value_;

};

單例)

(dcl)

Selenium WebDriver執行緒安全問題

專案中使用webdriver進行服務端渲染,解決seo的問題。但是最近上線的 多了之後,發現googlebot爬蟲同時爬幾個 的的時候,會有串資料的問題。上網搜了一下發現是webdriver不執行緒安全的 專案 中將webdriver宣告成了類成員變數,所以會有執行緒安全問題。於是將webdrive...

安卓 多執行緒

方法1 建立單獨的執行緒 new thread new runnable start 方法2 利用執行緒池 private executorservice executorservice executors.newfixedthreadpool 4 上面是建立乙個固定大小的執行緒池,這裡面的執行緒不...

安卓 多執行緒

第一種實現子執行緒的方法 繼承thread類 private class mythread extends thread new mythread start 第二種實現子執行緒的方式 實現runnable 任務 介面 private class myrunnable implements runn...