c++中多個執行緒使用同一個函式
阿新 • • 發佈:2019-01-10
我是小白,最近在學習實現一個簡單的執行緒池,執行緒池中維護了一個存放執行緒的陣列以及一個任務佇列。在建立執行緒池(建構函式中)時建立若干個執行緒,起始時由於任務佇列中沒有任務,建立的每一個執行緒都處於阻塞狀態。使用pthread_create函式建立執行緒時把所有的執行緒與同一個函式關聯在一起,也就是產生如下的程式碼:
pthread_t p[5];//執行緒池中有5個執行緒
for(int i = 0; i < 5; ++i)
{
pthread_create(&p[i], NULL, func, NULL);
}
看到這兒,我心裡產生了一個疑問:可不可以將所有的執行緒都關聯同一個回撥函式func呢?
經過網上查閱相關資料,是可以這樣做的,並且即使使用同一個函式這些函式之間也是互不影響的。每個程序都會有自己的虛擬地址空間,同一個程序中的每個執行緒都會在這個虛擬空間中,並被分配相應的資源。如果僅僅只使用函式內部的區域性變數,這些執行緒之間是互不相關的,各執行各自的,不用使用互斥鎖。如果不同的執行緒訪問了全域性變數那麼要使用互斥鎖,使得某一時刻只有一個執行緒操作該全域性變數。
下面通過一個程式碼說明兩個執行緒關聯一個函式:
#include <pthread.h> #include <iostream> using namespace std; void *print(void *arg) { for (int i = 0; i < 20; ++i) { cout << i << endl; } return NULL; } int main() { pthread_t p1, p2; pthread_create(&p1, NULL, print, NULL); pthread_create(&p2, NULL, print, NULL); pthread_join(p1, NULL); pthread_join(p2, NULL); return 0; }
從結果可以看出這兩個執行緒都使用了print函式,它們各自執行各自的,不會因為使用了同一個函式而受到影響。
1.兩個執行緒呼叫同一個函式
兩個執行緒中的函式的區域性變數由於是儲存在不同的執行緒中,因此不需要進行互斥處理(除非有非棧記憶體在搗亂,這種情況必須要有互斥鎖)
2.兩個不同程序中的兩個執行緒呼叫同一個處理函式
同樣,兩個執行緒中的函式的區域性變數由於是儲存在不同的執行緒中,因此不需要進行互斥處理