我目前正在尝试使用Apache Portable Runtime实现线程。除了缺乏文档或示例,一切都运行正常,但我不确定是否按照预期进行操作。
我需要两个线程和信号处理来捕获控制台上的CTRL-C以清理我的服务器和可能的线程。这是我目前的方法:
这个工作基本符合预期。唯一不确定的是清理是否正常运行。
我需要两个线程和信号处理来捕获控制台上的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;
}
这个工作基本符合预期。唯一不确定的是清理是否正常运行。
清理函数似乎被调用了多次(终端上出现了多次“Caught signal…”字符串)。有没有办法防止这种情况?这会有问题吗?
我找到了多个清理APR线程使用的例子。我的方法足够了吗,还需要一些注释掉的内容吗?或者我完全错了?