思路:
1 初始化執行緒
2 執行緒上鎖 -> 然後解除鎖的占用 -> 等待訊號通知
3 某個執行緒被通知到後 -> 獲取鎖 -> 鎖獲取後取任務隊裡第乙個任務函式 -> 解除鎖 -> 執行任務 -> 繼續第二步操作
關鍵點:訊號通知函式 notify_one() ,只會通知等待區中的乙個,讓其來獲取鎖, 避免驚群事件。
該執行緒池只支援空值返回的任意引數的函式(lambda),沒有異常處理,算是個基本雛形吧。看注釋就能理解。
#include #include #include #include #include #include #include using namespace std;
class threadpool
); // 執行緒池退出,並且任務佇列中沒有任務 執行緒退出
if (this->m_stop && this->m_queuetasks.empty())
// 取任務隊中第一並彈出
task = move(this->m_queuetasks.front());
this->m_queuetasks.pop();
// 鎖的作用域範圍結束,釋放互斥鎖
}// 執行任務
task();
}});
} }~threadpool()
// 通知所有臨界區的等待結束
m_condition.notify_all();
// 等待所有執行緒退出
for (thread& t : m_works)
}templatevoid addtask(f&& f, args&&... args)
// 新增
m_queuetasks.emplace(task);
// 鎖釋放
} // 在等待區的乙個被通知,避免驚群
m_condition.notify_one();
}private:
vectorm_works; // 執行緒集合
queue> m_queuetasks; // 等待執行的任務佇列
mutex m_mutex; // 任務佇列的互斥鎖
condition_variable m_condition; // 條件變數
bool m_stop; // 終止所有執行緒
};void testtaskint(int i)
void testtaskstring(string s)
int _tmain()
); this_thread::sleep_for(chrono::seconds(10));
} // pool 銷毀
return 0;
}
執行緒基本原理
1 每個執行緒都會建立自己的棧空間,執行自己的run方法。2 執行緒同步 執行緒安全問題都是由全域性變數及靜態變數引起的。若每個執行緒對全域性變數 靜態變數只有讀操作,而無寫操作,那麼這個全域性變數是執行緒安全的。若多個執行緒同時執行寫操作,一般需要考慮執行緒同步,否則影響執行緒安全。資料同步的三個...
mysql的基本原理 Mysql 基本原理
mysql 基本原理 mysql是一種關聯式資料庫管理系統,關聯式資料庫將資料儲存在不同的表中,而不是將所有資料放在乙個大倉庫內,這樣就增加了速度並提高了靈活性 ysql是資料庫登入命令 uroot預設超級使用者登入 p 預設沒密碼 中寫密碼 mysqladmin uroot password 12...
分頁基本原理 c
分頁是web應用程式非常重要的乙個技術。資料庫中的資料可能是成千上萬的,不可能吧這麼多的資料一次顯示在瀏覽器上面。一般根據每行資料在頁面上所佔的空間每頁顯示若干行,比如一般20行是乙個比較理想的顯示狀態。分頁方法主要有以下兩種思路 1 取出所有符合條件的資料,放到資料集或者記憶體中,然後逐頁瀏覽。例...