1

現在やっています。

int main()
{
  create_daemon_thread_and_run();

  getchar();
  return 0;
}

getchar()を使用して、メインスレッドがプロセス全体を終了するのをブロックします。

getchar()は好きではありません。なぜなら、stdinに何かを入力すると、それが返され、プロセスが終了するからです。しかし、私はそれを永遠にブロックしたいのです

while()
{
  ;
}

しかし、ループが永遠に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を使用している場合は、およびを参照CreateEventしてくださいWaitForMultipleObjects

于 2012-11-18T00:41:05.510 に答える