同步佇列作為乙個執行緒安全的資料共享區,經常用於執行緒之間資料讀取,比如半同步半非同步執行緒池的同步佇列。
其實做起來比較簡單,要用到list、鎖和條件變數,條件變數的作用是在佇列滿了或者空了的時候等待通知。先看乙個簡單的同步佇列:
#include #include#include
#include
#include
using
namespace
std;
template
class
******syncqueue
void take(t&x)
);x =m_queue.front();
m_queue.pop_front();
}private
: std::list
m_queue;
std::mutex m_mutex;
std::condition_variable_any m_notempty;
};
再看乙個帶上限的同步佇列:
#include#include#include
#include
#include
using
namespace
std;
template
class
syncqueue
void put(const t&x)
void put(t&&x)
void take(std::list&list)
);if(m_needstop)
return
; list =std::move(m_queue);
m_notfull.notify_one();
}void take(t&t)
);if(m_needstop)
return
; t =m_queue.front();
m_queue.pop_front();
m_notfull.notify_one();
}void
stop()
m_notfull.notify_all();
m_notempty.notify_all();
}bool
empty()
bool
full()
size_t size()
intcount()
private
:
bool notfull() const
bool notempty() const
template
void add(f&&x)
);if(m_needstop)
return
; m_queue.push_back(std::forward
(x));
m_notempty.notify_one();
}private
: std::list
m_queue; //
緩衝區 std::mutex m_mutex; //
互斥量和條件變數結合起來使用
std::condition_variable m_notempty;//
不為空的條件變數
std::condition_variable m_notfull; //
沒有滿的條件變數
int m_maxsize; //
同步佇列最大的size
bool m_needstop; //
停止的標誌
};
測試**比較簡單,就不寫了。實際的運用在後面的執行緒池中會用到。
CLH同步佇列
aqs內部維護著乙個fifo佇列,該佇列就是clh同步佇列。clh同步佇列是乙個fifo雙向佇列,aqs依賴它來完成同步狀態的管理,當前執行緒如果獲取同步狀態失敗時,aqs則會將當前執行緒已經等待狀態等資訊構造成乙個節點 node 並將其加入到clh同步佇列,同時會阻塞當前執行緒,當同步狀態釋放時,...
執行緒程式設計 同步佇列
我們經常會採用生產者 消費者關係的兩個執行緒來處理乙個共享緩衝區的資料。例如一 個生產者執行緒接受使用者資料放入乙個共享緩衝區裡,等待乙個消費者執行緒對資料取出處理。但是如果緩衝區的太小而生產者和消費者兩個非同步執行緒的速度不同時,容 易出現乙個執行緒等待另乙個情況。為了盡可能的縮短共享資源並以相同...
同步佇列的死鎖問題
main.m import import person.h int main int argc,const char argv nslog end 死鎖2 外層 在主線程佇列裡面新增乙個任務,因為是非同步,所以不用任何新增的任務執行完就可以繼續往下走,因此能夠輸出end 裡層 用同步新增任務到主線程...