- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我目前正在尝试使用 Apache Portable Runtime 实现线程。一切正常,但由于缺乏文档或示例,我不确定我是否按照预期的方式进行操作。
我需要两个线程和信号处理来捕获控制台上的 CTRL-C 以清理我的服务器和可能的线程。这是我目前的做法:
// Define APR thread pool
apr_pool_t *pool;
// Define server
MyServer *server;
// Define threads
apr_thread_t *a_thread, *b_thread;
apr_status_t status;
static void * APR_THREAD_FUNC func_a(apr_thread_t * thread,
void *data) {
// do func_a stuff here
}
static void * APR_THREAD_FUNC func_b(apr_thread_t * thread,
void *data) {
// do func_b stuff here
}
// Cleanup before exit
void cleanup(int s) {
printf("Caught signal %d\n", s);
// Destroy thread pool
apr_pool_destroy(pool);
//apr_thread_exit(a_thread, APR_SUCCESS);
//apr_thread_exit(b_thread, APR_SUCCESS);
//apr_terminate();
// Stop server and cleanup
server->stopServer();
delete server;
exit(EXIT_SUCCESS);
}
int main(void) {
// Signal handling
signal(SIGINT, cleanup);
// Create server
server = MyServerFactory::getServerImpl();
bool success = server->startServer();
// Initialize APR
if (apr_initialize() != APR_SUCCESS) {
printf("Could not initialize\n");
return EXIT_FAILURE;
}
// Create thread pool
if (apr_pool_create(&pool, NULL) != APR_SUCCESS) {
printf("Could not allocate pool\n");
return EXIT_FAILURE;
}
// Create a_thread thread
if (apr_thread_create(&a_thread, NULL, func_a, NULL,
pool) != APR_SUCCESS) {
printf("Could not create a_thread\n");
return EXIT_FAILURE;
}
//Create b_thread thread
if (apr_thread_create(&b_thread, NULL, func_b, NULL,
pool) != APR_SUCCESS) {
printf("Could not create b_thread\n");
return EXIT_FAILURE;
}
// Join APR threads
apr_thread_join(&status, a_thread);
apr_thread_join(&status, b_thread);
return EXIT_SUCCESS;
}
这或多或少符合预期。我唯一不确定的是清理工作是否正常。
cleanup-function 似乎被调用不止一次(字符串“Caught signal..”在终端上出现不止一次)。有没有办法防止这种情况?这有问题吗?
我发现不止一个使用后清理 APR 线程的示例。我的方式足够了还是我需要一些评论的东西?还是我完全错了?
最佳答案
APR 线程清理在 threading section 中有相当详细的解释。的 APR Tutorial .按顺序,清理步骤如下所示:
apr_thread_exit()
。 Unix 线程会自动终止,而 Windows 线程不会。调用此函数以实现可移植性(并在必要时返回状态)。apr_thread_join()
等待所有线程结束。apr_pool_destroy()
释放主内存池。 (使用 apr_thread_exit()
释放子内存池。)apr_terminate()
释放其他资源(套接字等)。请注意,在没有这些最终步骤的情况下,只需在另一个线程中调用 exit()
can cause crashes .他们还有一个 brief sample program这展示了其中的一些内容。
至于为什么您的信号处理程序会触发两次,我认为这与 APR 无关。 SIGINT 被发送到父进程和子进程,所以我怀疑 MyServer
正在 fork 一个新进程并且两者都在调用处理程序。
关于c++ - APR 线程和信号处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14192219/
我第一次在 ubuntu 12.04 中安装 Apache,我在链接 Compiling and installing apache 中查找 它说我们应该先有 APR 和 APR-util 我按照程序
按升序对具有此格式日期的整列进行排序 Apr-18 | Apr-19 | Dec-15 | Feb-19 | Nov-13 | Nov-17 | ORDER BY CONVERT(DateTime,
服务器.xml Tomcat 日志 Oct 12, 2016 3:11:41 PM org.apache.catalina.core.AprLifecycleListener init SEVERE
我正在尝试安装 httpd-devel apr-devel apr-util-devel centos 5.6。我有依赖问题 Resolving Dependencies --> Running
我是个贪吃的人,为了证明这一点,我给自己弄了一台服务器,并尝试自己构建整个 LAMP 堆栈。然后我遇到了一个问题,在 httpd 的配置/制作/安装过程中,我发现我编译的 apr-util 似乎没有正
我目前正在尝试生成一个修补过的 apache2 2.4.3 的 RPM 包 我修改了存档提供的 httpd.spec,以使用 APR 的 SVN 版本(CentOS 不提供 1.4 版): %buil
我正在 docker 容器中安装一个 java 应用程序。它运行良好,但我在日志中不断出现这个错误: INFO 1 --- [ost-startStop-1] o.a.catalina.core.Ap
我想使用 APR 来 mmap 非常大的文件,大于 4Gb。起初我需要创建这么大的文件,但我发现函数 apr_file_seek 接受类型为 apr_seek_where_t 的参数,这只是 int
我目前正在尝试使用 Apache Portable Runtime 实现线程。一切正常,但由于缺乏文档或示例,我不确定我是否按照预期的方式进行操作。 我需要两个线程和信号处理来捕获控制台上的 CTRL
#./configure --prefix……检查编辑环境时出现: checking for APR... no configure: error: APR not found . P
Data::UUID 的文档指出 A UUID is 128 bits long, and is guaranteed to be different from all other UUIDs/GUI
我正在使用 libapr,但它们的一些基本原语似乎不能很好地工作,呈现出非常奇怪的行为。这是我正在编写的代码: pr_pool_t *mp=NULL; apr_file_t *fp =
我有几台运行 Tomcat 7.0 并带有 APR+SSL 连接器的生产服务器,由于最近的 POODLE 攻击,我被要求在其中一些服务器中完全禁用 SSLv3。我挖掘了 Tomcat Connecto
这是我在这个论坛上的第一个问题,如果有任何错误,请提前接受我的道歉。我在使用 SSL 和 APR 配置 tomcat 时遇到问题。 上下文:tomcat 7、Java 7、OpenSSL、几个有效的
apr_pool_t *pool; char *a; char *b; apr_pool_create(&pool, NULL); a = (char *) apr_palloc(pool, 10);
gcc (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1 Apache protable runtime 1.4 c89 and compiling in -m
自从我使用 C 以来已经有很长一段时间了,但现在我正在尝试编译一个简短的脚本,从 Apache-Portable-Runtime (APR) 获取服务器统计信息。 头文件位于/usr/include/
我正在使用 APR 库在 C++ 中创建可移植的多线程程序。问题是我需要在不需要线程时让线程休眠,但manual 中没有提到函数这样做。 你现在知道如何在不需要使用 native 系统函数的情况下休眠
我们收到与 AXIS2 1.7.3 相关的错误。我们正在使用最新的 Java8 运行 Tomcat8。 java.io.IOException: APR error: -730054 org.apac
我想从 python 移植以下正则表达式: HASH_REGEX = re.compile("([a-fA-F0-9]{32})") if HASH_REGEX.match(target):
我是一名优秀的程序员,十分优秀!