考虑一个由许多工作线程组成的并行程序。这些线程在某些文件描述符上有一个poll
循环。程序应该运行直到ctrl-c被命中/进程收到SIGINT
。该程序永远不应该被不必要地唤醒。
我设计了以下sigwait
,std::thread
,pipe
和pthread_sigmask
的组合。请注意,在实际应用程序中,有更多的文件描述符,因此我没有使用atomics来关闭线程。
#include <thread>
#include <iostream>
#include <cstdlib>
#include <csignal>
extern "C" {
#include <unistd.h>
#include <fcntl.h>
#include <pthread.h>
#include <poll.h>
}
int fds[2];
void thread_run() {
struct pollfd pfd = {fds[0], POLLIN, 0};
int ret = poll(&pfd, 1, -1);
if (ret != 1) std::terminate();
if (!pfd.revents & POLLIN) std::abort();
}
int main()
{
int ret = pipe(fds);
if (ret) std::abort();
sigset_t ss;
sigemptyset(&ss);
sigaddset(&ss, SIGINT);
ret = pthread_sigmask(SIG_BLOCK, &ss, NULL);
if (ret) std::abort();
std::thread t(thread_run);
int sig;
ret = sigwait(&ss, &sig);
if (ret) std::abort();
char b = 0;
ret = write(fds[1], &b, 1);
if (ret != 1) std::abort();
t.join();
close(fds[0]);
close(fds[1]);
}
该程序似乎没有任何问题。
std::thread
- 创建和pthread_sigmask
,该计划是否仍然正确?答案 0 :(得分:1)
您可能希望std::abort
来电,以应对意外情况。当异常处理失败时,C ++运行时将调用std::terminate
。