无限循环直到应用程序收到信号

发布于 2024-11-09 00:13:37 字数 300 浏览 0 评论 0原文

我有一个启动 5 个线程的应用程序。

启动这些线程后,main() 中没有任何反应。

main(){
      `start thread 1..5
}

如何在 main() 中无限循环,以便我的程序将连续运行,直到收到信号。

我不想使用,

while(true)

因为它会占用 CPU 周期。 (正如我所想)

编辑: 我正在使用海湾合作委员会4 线程API:pthread 操作系统:Linux

I have an application which starts 5 threads.

After starting those threads nothing happens in main().

main(){
      `start thread 1..5
}

How do I loop infinitely in main() so my program will run continuously until it gets a signal.

I don't want to use

while(true)

because it will eat CPU cycle. (As I think )

Edit:
I am using gcc 4
Thread Api :pthread
OS : Linux

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

公布 2024-11-16 00:13:37

最简单的是:

while (true) sleep(1000);

最好的是join()所有五个线程。

the simplest would be:

while (true) sleep(1000);

and the best would be to join() all the five threads.

庆幸我还是我 2024-11-16 00:13:37

sigsuspend() 函数正是为此目的而设计的 - 它将挂起调用线程,直到它收到导致调用信号处理程序的信号。

为了避免竞争条件(信号在进程调用 sigsuspend() 之前到达),您应该阻止该信号,检查它,然后将掩码传递给 sigsuspend() code> 解锁它:

/* Block SIGUSR1 */
sigset_t sigusr1set, origset;
sigemptyset(&sigusr1set);
sigaddset(&sigusr1set, SIGUSR1);
sigprocmask(SIG_BLOCK, &sigusr1set, &origset);

/* Set up threads etc here */

/* Unblock SIGUSR1 and wait */
sigdelset(&origset, SIGUSR1);
sigsuspend(&origset);

The sigsuspend() function is designed for precisely this purpose - it will suspend the calling thread until it recieves a signal that results in the calling of a signal handler.

To avoid a race condition (where the signal arrives just before your process calls sigsuspend()), you should block the signal, check for it, then pass a mask to sigsuspend() that unblocks it:

/* Block SIGUSR1 */
sigset_t sigusr1set, origset;
sigemptyset(&sigusr1set);
sigaddset(&sigusr1set, SIGUSR1);
sigprocmask(SIG_BLOCK, &sigusr1set, &origset);

/* Set up threads etc here */

/* Unblock SIGUSR1 and wait */
sigdelset(&origset, SIGUSR1);
sigsuspend(&origset);
情话难免假 2024-11-16 00:13:37

加入这些线程请参阅 pthread_join

Join those threads see pthread_join.

吝吻 2024-11-16 00:13:37

您可以尝试 Boost::Synchronization 函数, 像这样:

main(){
  `start thread 1..5
  wait for signal
  exit
}

You could try the Boost::Synchronization functions, like this:

main(){
  `start thread 1..5
  wait for signal
  exit
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文