[英]How to return value from the thread back to main function without using blocking function in C++/C
[英]How to run a thread infinitely without blocking main thread in c++?
我正在嘗試制作一個本機應用程序,我需要一個單獨的線程在后台凍結一些值(持續覆蓋延遲),我不需要從它返回到 main。 因此,在我與它分離時創建線程后,它不會進行凍結。
pthread_create(&frzTh, NULL, freezingNow, NULL);
pthread_detach(frzTh);
但是,如果我加入線程,那么它會執行凍結,但我的主線程在等待子線程完成時被阻塞,並且由於子線程無限運行,因此不會出現。
pthread_create(&frzTh, NULL, freezingNow, NULL);
pthread_join(frzTh,NULL);
因此,我嘗試使用 fork() 創建子進程而不是線程。 現在,我能夠執行與我的主要任務並行的所有任務。 但是,這會導致大量 memory 使用並導致設備發熱。
pid_t pid_c = fork();
if (pid_c == 0 && freeze) {
while (freeze) {
Freeze();
usleep(delay);
}
}
那么,最好的方法是什么?
最好的例子是游戲守護者應用程序,它的凍結機制。
要正確執行此操作,您需要有一種機制,主線程可以通過該機制導致子線程退出(一個簡單的std::atomic<bool> pleaseQuitNow
,子線程定期測試,並且主線程在調用之前設置為 true pthread_join()
,會很好)。
至於為什么你需要在退出之前調用pthread_join()
,而不是只允許主線程在子線程保持運行時退出:通常有運行時環境代碼在main()
返回之后執行,這會破壞各種運行進程中所有線程共享的時間數據結構。 如果在主線程拆除這些數據結構時任何線程仍在運行,則仍在運行的線程可能會嘗試訪問這些數據結構之一,而它處於已破壞或半破壞的 state ,導致偶爾的退出崩潰。
(當然,如果您的程序根本不退出,或者如果您不關心偶爾的退出時崩潰,您可以跳過子線程的有序關閉,但由於實現起來並不困難,您是最好以正確的方式做事,避免在演示結束時您的應用程序崩潰時出現尷尬)
如果你想做一些與主線程異步的事情直到主線程結束,我推薦 Promise - c++ 的未來
這個例子:) 祝你好運
#include <future>
#include <iostream>
#include <thread>
void DoWork(promise<int> p)
{
// do something (child thread)
// saved value in p
p.set_value(10);
}
int main(void)
{
promise<int> p;
auto future = p.get_future();
thread worker{ DoWork, std::move(p)};
// do something you want
// return result
int result = future.get();
std::cout<< result <<'\n'; // print 10
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.