1

目前我正在做。

int main()
{
  create_daemon_thread_and_run();

  getchar();
  return 0;
}

我使用 getchar() 来阻止主线程终止整个进程。

我不喜欢 getchar() 因为如果我在标准输入中输入一些内容,它将返回并且进程将终止。但我希望它永远阻塞,比如

while()
{
  ;
}

但我担心 while loop 永远会耗尽 CPU 使用率。我想要的东西只是让线程休息,而不是吃CPU。我想要跨平台的方式来做到这一点。

4

3 回答 3

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;
}
于 2012-11-18T00:43:32.770 回答
2

你可能会更好地使用 pthread_join (如果它是一个 pthread,非分离线程)。

否则,请使用互斥体、条件变量或信号量。

下面的示例演示了如何使用信号量,它响应信号(例如,当在终端中使用 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;
}
于 2012-11-18T00:45:45.693 回答
-1

你的程序是做什么的?

如果后台线程正在执行某种计算等,那么您的主线程应该等待后台线程完成。如果您使用的是 Windows,请参阅CreateEventWaitForMultipleObjects

于 2012-11-18T00:41:05.510 回答