這些天,我想了解更多有關線程在Windows中的東西。我想到了這個實際應用:C++ winapi線程
假設按下按鈕「開始」時有多個線程啓動。假設這些線程是密集的(他們繼續運行/總是有一些工作)。
這個程序也會有一個「停止」按鈕。當按下這個按鈕時,所有的線程都會以一種很好的方式關閉:釋放資源並放棄工作並返回按下「開始」按鈕之前的狀態。
該應用程序的另一個要求是,如果按下「停止」按鈕,線程運行的函數不應包含任何指令檢查。線程中運行的函數不應該關心停止按鈕。
語言:C++
操作系統:Windows
問題:
WrapperFunc(function, param)
{
// what to write here ?
// if i write this:
function(param);
// i cannot stop the function from executing
}
我應該如何構建包裝函數,這樣我可以正確地停止線程? (不使用TerminateThread或其他功能)
如果程序員動態地分配一些內存會怎麼樣?我怎麼才能在關閉 線程之前釋放它?(注意,當我按下「停止按鈕」時,線程仍在處理數據) 我雖然關於重載新操作符或只是強加使用預定義的 函數來使用動態分配內存。但是,這意味着 使用此API的程序員受到限制,而這不是我想要的。
謝謝
編輯:骷髏來形容,我想實現的功能。
struct wrapper_data
{
void* (*function)(LPVOID);
LPVOID *params;
};
/*
this function should make sure that the threads stop properly
(free memory allocated dynamically etc)
*/
void* WrapperFunc(LPVOID *arg)
{
wrapper_data *data = (wrapper_data*) arg;
// what to write here ?
// if i write this:
data->function(data->params);
// i cannot stop the function from executing
delete data;
}
// will have exactly the same arguments as CreateThread
MyCreateThread(..., function, params, ...)
{
// this should create a thread that runs the wrapper function
wrapper_data *data = new wrapper_data;
data->function = function;
data->params = params;
CreateThread(..., WrapperFunc, (LPVOID) wrapper_data, ...);
}
thread_function(LPVOID *data)
{
while(1)
{
//do stuff
}
}
// as you can see I want it to be completely invisible
// to the programmer who uses this
MyCreateThread(..., thread_function, (LPVOID) params,...);
考慮使用'volatile'關鍵字來防止編譯器導致布爾值被緩存並保存在一個寄存器中,從而防止線程中的值發生變化。 – 2012-06-14 10:26:50
問題是我想讓用戶不關心在線程函數中停止,只需編寫功能。 –
@infact好主意,完成。 –