c 執行緒庫基本原理

2021-09-26 05:35:03 字數 1382 閱讀 4171

思路:

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 取出所有符合條件的資料,放到資料集或者記憶體中,然後逐頁瀏覽。例...