2016-01-07 22 views
4

想象一下,我使用同步功能,從我的Node.js的插件:使用的std ::線程Node.js的附加組件

var check_ok = addon.my_function(parameters); 
var final_results = addon.final_function(parameters); 

但在方法的代碼,我有:

std::thread t[10]; //Global 
//... 
void my_function(const FunctionCallbackInfo<v8::Value>& args) { 
//.... 
t[0] = thread(random_void_function, [parameters]) 
t[1] = thread(random_void_function_2, [parameters]) 
//... 
} 
//... 
void final_results(const FunctionCallbackInfo<v8::Value>& args) { 
//... 
t[0].join(); 
t[1].join(); 
//...Give results.. etc 
} 

所以我有2個插件的同步調用,但在這個插件中使用了兩個線程。一個函數將啓動線程,另一個函數將加入它們。問題是:random_void_functionrandom_void_function_2會並行運行?由於my_functionfinal_function是同步的,因此random_void_functionrandom_void_function_2會阻止事件循環?從我看到的,他們不會阻止。

+1

我什麼都不知道的Node.js的,但是從C++的角度來看這兩個功能將在parrallel運行,並且不會阻止任何東西(除非它們調用一些阻塞函數本身)。 – SergeyA

回答

1

問題是:random_void_function和random_void_function_2會並行運行嗎?

是的,只要它們活得夠長。如果它們是短命的,同樣合理的結果是第一次開始和退出之前,第二次啓動和退出(或反之亦然)。

由於my_function和final_function是同步的,因此random_void_function和random_void_function_2將阻止事件循環?從我看到的,他們不會阻止。

不,也許。 addon.my_function而不是阻止事件循環。 addon.final_results(我假設你打算在上面打電話而不是addon.final_function)只會在random_void_function壽命長的情況下阻止。如果他們短命並已經退出,addon.final_results將立即退出。

既然你沒有看到任何阻止,我懷疑random_void_function s爲曇花一現。

+0

我的錯誤..'final_function'是一個異步函數。這就是爲什麼不阻止。考慮到這個問題,我同意你的看法。 – zippo

+0

請隨時接受答案。 – Andy