執行緒同步2019 10 31

2021-09-29 13:53:04 字數 4378 閱讀 6215

void process() // __attribute__ ((noinline))//不讓函式內斂

muduo::mutexlockguard lock(mutex_);

print();    //新增它很容易產生死鎖,在本程式中。

void print() const // __attribute__ ((noinline))

muduo::mutexlockguard lock(mutex_);

private:

mutable muduo::mutexlock mutex_;

int main()

request req;

req.process();

gdb中bt列出呼叫棧

mutex是加鎖原語。條件變數的學名叫管程,是用來乙個或多個執行緒等待某個表示式為真,即等待別的執行緒「喚醒」它。

條件變數只有一種正確的使用方式,幾乎不可能用錯。對於wait端:

1、必須與mutex一起使用,該布林表示式的讀寫需受此mutex保護。

2、在mutex已上鎖的時候才可以呼叫wait()。

3、把判斷布林條件和wait()放到while迴圈中。

對於signal/broadcast端:

1、不一定要在mutex已上鎖的情況下呼叫signal(理論上)。

2、在signal之前一般要修改布林表示式。

3、修改布林表示式通常要用mutex保護。

4、注意區分signal與broadcast:「broadcast通常用於表明狀態變化,signal通常用於表示資源可用。」

倒計時:主要的用途:

1、主線程發起多個子執行緒,等這些子執行緒各自都完成一定任務之後,主線程才繼續執行。通常用於主線程等待多個子執行緒完成初始化。

2、主線程發起多個子執行緒,子執行緒都等待主線程,主線程完成其他一些任務之後通知所有子執行緒開始執行。通常用於多個子執行緒等待主線程發出「起跑"命令。

互斥器(mutex)和條件變數構成了多執行緒程式設計的全部必備原語,用他們即可完成任何多執行緒的同步任務,二者不能相互替代。

讀寫鎖(rwlock)。

不要用讀寫鎖和訊號量。

muduo庫不提供讀寫鎖的封裝。

mutexlock  mutexlockguard  condition 介紹

//mutexlock類

class mutexlock : boost :: noncopyable

public:

mutexlock():holder_(0)

pthread_mutex_init(&mutex_,null);

~mutexlock()

assert(holder_ == 0);

pthread_mutex_destroy(&mutex);

bool islockedbythisthread()

return holder_ == currentthread::tid();

void assertlocked()

assert(islockedbythisthread());

void lock() //僅供mutexlockguard呼叫,嚴禁使用者**呼叫

pthread_mutex_lock(&mutex_);  //這兩行順序不能反

holder_ = currentthrea::tid();

void unlock() //僅供mutexlockguard呼叫,嚴禁使用者**呼叫

holder_ = 0;    //這兩行順序不能反

pthread_mutex_unlock(&mutex_);

pthread_mutex_t* getpthreadmutex()//僅供condition呼叫,嚴禁使用者**呼叫

return &mutex_;

private:

pthread_mutex_t mutex_;

pid_t holder_;

//mutexlockguard類

class mutexlockguard : boost::noncopyable

public:

explicit mutexlocakguard(mutexlock& mutex) : mutex_(mutex)

mutex_.lock();

~mutexlockguard()

mutex_.unlock();

private:

mutexlock& mutex_;

#define mutexlockguard(x) static_assert(false,"missing mutex guard var name")

這個巨集的作用是防止程式裡出現如下錯誤:

void doit()

mutexlockguard(mutex);  //遺漏變數名,產生乙個臨時物件又馬上銷毀了。

//結果沒有鎖住臨界區

//正確寫法mutexlockguard lock(mutex);

//臨界區

//condition類

class condition : boost::noncopyable

public: 

explicit condition(mutexlock& mutex) : mutex_(mutex)

pthread_cond_init(&pcond_,null);

~condition()

pthread_cond_destroy(&pcond_);

void wait()

pthread_cond_wait(&pcond_,mutex_.getpthreadmutex());

void notify()

pthread_cond_signal(&pcond_);

void notifyall()

pthread_cond_broadcast(&pcond_);

private:

mutexlock& mutex_;

pthread_cond_t pcond_;

如果乙個class要包含mutexlock和condition,注意:mutex_應先於condition_構造,並作為後者的構造引數。

class countdownlatch

public:

countdownlatch(int count) : mutex_(),condition_(mutex_),count_(count)   //初始化順序要與成員宣告保持一致

private:

mutable mutexlock mutex_; //順序很重要,先mutex後condition

condition condition_;

int count_;

//mutex和condition variable 是非常底層的原語,主要用來實現更高階的併發程式設計工具。

//執行緒安全的singleton實現

template

class singleton : boost::noncopyable

public:

static t& instance()

pthread_once(&ponce_,&singleton::init);

return *value_;

private:

singleton();

~singleton();

static void init()

value_ = new t();

private:

static pthrea_once_t pconce_;

static t* value_;

//必須在標頭檔案定義static變數

template

pthread_once_t singleton::ponce_ = pthread_once_init;

template

t* singleton::value_ = null;

執行緒等待分為兩種:一種是等待資源可用,一種等待進入臨界區。

總結:1、執行緒同步四原則,盡量用高層同步設施(執行緒池、佇列、倒計時);

2、使用普通互斥器和條件變數完成剩餘的同步任務,採用raii慣用手法(idiom)和scoped locking。

同步 執行緒同步

操作執行的先後順序。同步指兩個或兩個以上隨時間變化的量在變化過程中保持一定的相對關係。同步 英語 synchronization 指對在乙個系統中所發生的事件 event 之間進行協調,在時間上出現一致性與統一化的現象。在系統中進行同步,也被稱為及時 in time 同步化的 synchronous...

20191031 專題 高精度

include using namespace std const int a 300 int n,m char a a b a int s1 a s2 a int r a signed main if jw r n jw while n 1 r n n for int i n i 0 i prin...

11 6 執行緒 執行緒同步

除了計算機體系結構的因素以外,程式使用變數的方式也會引起競爭,也會導致不一致的情況發生。例如,可能會對某個變數加1,然後基於這個數值做出某種決定。增量操作這一步和做出決定這一步兩者的組合並非原子操作,因而給不一致情況提供了可能。1.互斥量 可以通過使用pthread的互斥介面保護資料,確保同一時間只...