簡體   English   中英

如何在不阻塞 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM