提问者:小点点

如何在C++中无限运行一个线程而不阻塞主线程?


我正在尝试做一个原生的应用程序,我需要一个单独的线程在后台冻结一些值(不断覆盖与延迟),我不需要任何返回从它到Main。所以当我从线程分离时创建线程后,它不会进行冻结。

  pthread_create(&frzTh, NULL, freezingNow, NULL);
  pthread_detach(frzTh);

但是如果我加入线程,那么它将执行冻结,但是我的主线程在等待子线程完成时会被阻塞,并且由于子线程无限运行,所以不会出现。

pthread_create(&frzTh, NULL, freezingNow, NULL);
pthread_join(frzTh,NULL);

因此,我尝试使用fork()创建子进程而不是线程。现在,我能够执行与我的主要任务平行的所有任务。但是,这会导致大量内存占用,并导致器件发热。

   pid_t pid_c = fork();
      
   if (pid_c == 0 && freeze) {
 
             while (freeze) {
                 Freeze();
                 usleep(delay);
             }
         }

那么,做这件事的最好方法是什么呢?


共1个答案

匿名用户

如果您想用Mainthread做一些异步直到结束main,我推荐C++中Promise-Future

这个例子:)祝你好运

#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
}

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(何在|c++|中|无限|运行|线程|阻塞|主|线程)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?