gpt4 book ai didi

c++ - APR 线程和信号处理

转载 作者:太空狗 更新时间:2023-10-29 23:18:15 27 4
gpt4 key购买 nike

我目前正在尝试使用 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;
}

这或多或少符合预期。我唯一不确定的是清理工作是否正常。

  1. cleanup-function 似乎被调用不止一次(字符串“Caught signal..”在终端上出现不止一次)。有没有办法防止这种情况?这有问题吗?

  2. 我发现不止一个使用后清理 APR 线程的示例。我的方式足够了还是我需要一些评论的东西?还是我完全错了?

最佳答案

APR 线程清理在 threading section 中有相当详细的解释。的 APR Tutorial .按顺序,清理步骤如下所示:

  1. 在线程本身中调用apr_thread_exit() 。 Unix 线程会自动终止,而 Windows 线程不会。调用此函数以实现可移植性(并在必要时返回状态)。
  2. 在主线程中调用apr_thread_join()等待所有线程结束。
  3. 调用apr_pool_destroy() 释放主内存池。 (使用 apr_thread_exit() 释放子内存池。)
  4. 调用apr_terminate() 释放其他资源(套接字等)。请注意,在没有这些最终步骤的情况下,只需在另一个线程中调用 exit() can cause crashes .

他们还有一个 brief sample program这展示了其中的一些内容。

至于为什么您的信号处理程序会触发两次,我认为这与 APR 无关。 SIGINT 被发送到父进程和子进程,所以我怀疑 MyServer 正在 fork 一个新进程并且两者都在调用处理程序。

关于c++ - APR 线程和信号处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14192219/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com