多執行緒同步的開發
介紹
根據多執行緒同步原理中介紹的內容可知,多執行緒開發就是要讓多個執行緒正確的訪問臨界資源,實現多執行緒同步。
所以,一般的同步策略最簡單的就是:使用互斥體(mutex)來管理臨界資源(與臨界資源同時定義,生命期相同,作用域相同),互斥體提供P、V操作(獲取,獲取不到就等待;釋放,喚醒等待的執行緒)。不同的執行緒使用鎖(Guard)來自動呼叫(建構函式、解構函式)互斥體的P、V操作,從而實現同步。
互斥體(Mutex)
下面以ACE中互斥體的使用來實現:多個人使用印表機的場景
#include <iostream>
#include "ace/Log_Msg.h"
#include "ace/Mutex.h"
#include "ace/Task.h"
class Printer
{
public:
Printer(){}
void print(int paper_id)
{
this->mutex_.acquire();
ACE_DEBUG((LM_DEBUG,"person(%t) is printing paper(%d)\n",paper_id));
ACE_OS::sleep(1);
this->mutex_.release();
}
private:
ACE_Thread_Mutex mutex_;
};
class Person : public ACE_Task_Base
{
public:
Person(Printer& printer):printer_(printer){}
virtual int svc(void)
{
ACE_DEBUG((LM_DEBUG,ACE_TEXT("Person(%t) is running\n")));
for (int i=0;i<4;++i)
{
this->printer_.print(i);
}
return 0;
}
private:
Printer& printer_;
};
int main(int argc, char *argv[])
{
Printer printer_obj;
Person person1(printer_obj);
Person person2(printer_obj);
person1.activate();
person2.activate();
person1.wait();
person1.wait();
return 0;
}
鎖(守衛、Guard)
Guard類的主要邏輯是:建構函式通過執行互斥體的P操作獲取臨界資源;解構函式通過執行互斥體的V操作來釋放臨界資源。在建構函式之後操作臨界資源。構造與析構之間的程式碼段形成臨界區(臨界區越小越好)。
Guard類的原始碼片段:
template <class LOCK>
class Guard
{
public:
//隱式的切自動的獲取鎖
ACE_Guard (LOCK &lock): lock_(&lock){acquire();}
//隱式的釋放鎖
~ACE_Guard (void){release();}
//顯示的獲取鎖
int acquire (void){return owner_ = lock_->acquire();}
//顯示的釋放鎖
int release (void)
{
if (owner_ == -1)
{
return -1;
}
else
{
owner_ = -1;
return lock_->release();
}
}
bool locked (void) const {return owner_ != -1;}
protected:
//用子類來儲存指標
ACE_Guard (LOCK *lock): lock_ (lock), owner_ (0) {}
//指向我們正在看守的LOCK
LOCK *lock_;
//跟蹤記錄我們是否獲取了鎖
int owner_;
};
下面以ACE中的Guard來實現:多個人使用印表機的場景(僅僅改動了印表機列印的同步程式碼)#include <iostream>
#include "ace/Log_Msg.h"
#include "ace/Mutex.h"
#include "ace/Task.h"
class Printer
{
public:
Printer(){}
void print(int paper_id)
{
ACE_Guard<ACE_Thread_Mutex> guard(this->mutex_);
//this->mutex_.acquire();
ACE_DEBUG((LM_DEBUG,"person(%t) is printing paper(%d)\n",paper_id));
ACE_OS::sleep(1);
//this->mutex_.release();
}
private:
ACE_Thread_Mutex mutex_;
};
class Person : public ACE_Task_Base
{
public:
Person(Printer& printer):printer_(printer){}
virtual int svc(void)
{
ACE_DEBUG((LM_DEBUG,ACE_TEXT("Person(%t) is running\n")));
for (int i=0;i<4;++i)
{
this->printer_.print(i);
}
return 0;
}
private:
Printer& printer_;
};
int main(int argc, char *argv[])
{
Printer printer_obj;
Person person1(printer_obj);
Person person2(printer_obj);
person1.activate();
person2.activate();
person1.wait();
person1.wait();
return 0;
}
其他庫
(std、boost等基本介面都是如此,可以觸類旁通)
相關文章
- C#多執行緒開發-執行緒同步 02C#執行緒
- 多執行緒和多執行緒同步執行緒
- 多執行緒同步執行緒
- 多執行緒同步的原理執行緒
- 多執行緒與併發----Semaphere同步執行緒
- java 多執行緒 –同步Java執行緒
- java 多執行緒 --同步Java執行緒
- 【java 多執行緒】多執行緒併發同步問題及解決方法Java執行緒
- 多執行緒下的程式同步(執行緒同步問題總結篇)執行緒
- 【多執行緒總結(二)-執行緒安全與執行緒同步】執行緒
- 4、Linux多執行緒,執行緒同步(2)Linux執行緒
- 多執行緒(2)-執行緒同步互斥鎖Mutex執行緒Mutex
- java多執行緒–同步鎖Java執行緒
- 多執行緒 -- 同步器執行緒
- windows多執行緒同步--事件Windows執行緒事件
- 非同步VS多執行緒非同步執行緒
- C#多執行緒開發-執行緒池03C#執行緒
- iOS 開發中的多執行緒iOS執行緒
- java多執行緒詳解(併發,並行,同步)Java執行緒並行
- 多執行緒Demo學習(執行緒的同步,簡單的執行緒通訊)執行緒
- Java多執行緒/併發11、執行緒同步通訊:notify、waitJava執行緒AI
- 非同步/同步,阻塞/非阻塞,單執行緒/多執行緒概念梳理非同步執行緒
- 多執行緒的同步和非同步學習執行緒非同步
- #大學#Java多執行緒學習02(執行緒同步)Java執行緒
- 多執行緒(2)-執行緒同步條件變數執行緒變數
- 【iOS開發】多執行緒 - 概述iOS執行緒
- C#多執行緒開發-執行緒基礎 01C#執行緒
- Java多執行緒學習(3)執行緒同步與執行緒通訊Java執行緒
- iOS 多執行緒--GCD 序列佇列、併發佇列以及同步執行、非同步執行iOS執行緒GC佇列非同步
- Dart 非同步與多執行緒Dart非同步執行緒
- windows多執行緒同步--互斥量Windows執行緒
- 多執行緒靜態方法同步執行緒
- Java多執行緒—執行緒同步(單訊號量互斥)Java執行緒
- JAVA多執行緒詳解(3)執行緒同步和鎖Java執行緒
- Java多執行緒之執行緒同步【synchronized、Lock、volatitle】Java執行緒synchronized
- iOS多執行緒程式設計:執行緒同步總結iOS執行緒程式設計
- .NET多執行緒程式設計(3):執行緒同步 (轉)執行緒程式設計
- Java 多執行緒同步的五種方法Java執行緒