1. 程式人生 > >c++中多個執行緒使用同一個函式

c++中多個執行緒使用同一個函式

我是小白,最近在學習實現一個簡單的執行緒池,執行緒池中維護了一個存放執行緒的陣列以及一個任務佇列。在建立執行緒池(建構函式中)時建立若干個執行緒,起始時由於任務佇列中沒有任務,建立的每一個執行緒都處於阻塞狀態。使用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.兩個不同程序中的兩個執行緒呼叫同一個處理函式

同樣,兩個執行緒中的函式的區域性變數由於是儲存在不同的執行緒中,因此不需要進行互斥處理