目前我在做。
int main()
{
create_daemon_thread_and_run();
getchar();
return 0;
}
我使用getchar()来阻止主线程终止整个过程。
我不喜欢getchar(),因为如果我输入stdin的东西,它将返回并且进程将终止。但是我希望它永远阻止,比如
while()
{
;
}
但我关注的是,循环永远会占用CPU用量。我想要的东西只是让线程休息,不要吃CPU。我想要跨平台的方式来做到这一点。
答案 0 :(得分:3)
你可以简单地等待你的线程完成,thread.join将阻塞主线程直到你的衍生线程完成。但是你没有将你的线程分离到守护进程。
如果你可以从create_daemon_thread_and_run();
获得某种状态标志,那将会更容易
int main()
{
bool is_thread_finished = false;
create_daemon_thread_and_run(is_thread_finished);
while (!is_thread_finished){
sleep(1);
}
return 0;
}
C ++ 11演示:
#include <thread>
void thread_function()
{
// do something in a loop
}
int main()
{
std::thread t1(thread_function);
t1.join();
return 0;
}
答案 1 :(得分:2)
你可能更善于使用pthread_join(如果它是一个pthread,非分离的线程)。
否则,请使用互斥锁,条件变量或sempahore。
以下示例演示了如何使用信号量,它响应信号(例如,在终端中使用Ctrl-C时)。当然,你的“恶魔”实现可以在信号量完成处理并想要关闭时自由发出信号。
#include <signal.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <assert.h>
#include <semaphore.h>
static sem_t daemon_shutdown;
static void exit_handler(int sig) {
sem_post(&daemon_shutdown);
}
static int set_signal_handler(int sig, void (*handler)(int)) {
struct sigaction sa;
memset(&sa, 0, sizeof(struct sigaction));
sa.sa_handler = handler;
sigemptyset(&(sa.sa_mask));
sa.sa_flags = 0;
if(sigaction(sig, &sa, NULL) == -1) {
perror("sigaction");
return -1;
}
return 0;
}
// DEFINE THESE FOR YOUR PROGRAM:
int do_daemon();
void do_exit();
//
int main() {
assert(0 == sem_init(&daemon_shutdown, 0, 0));
if(!do_daemon()) {
do_exit();
return 1;
}
if(
set_signal_handler(SIGHUP, exit_handler) != 0 ||
set_signal_handler(SIGINT, exit_handler) != 0 ||
set_signal_handler(SIGTERM, exit_handler) != 0 ||
set_signal_handler(SIGPIPE, SIG_IGN) != 0) {
do_exit();
return 2;
}
sem_wait(&daemon_shutdown);
do_exit();
return 0;
}
答案 2 :(得分:-1)
你的课程做什么?
如果后台线程正在执行某种计算等,那么主线程应该等待后台线程完成。如果您使用的是Windows,请参阅CreateEvent
和WaitForMultipleObjects
。