我正在使用 2 个不同的异步事件库。一个在主线程中,一个在创建的线程中。我想在创建的线程中从主线程调用函数,但是失败了,因为创建的线程中的异步事件库永远不会返回。不幸的是,我必须使用另一个异步事件库,因为它是我用来实现该功能的库的一部分。
我的代码(非常简化)如下:
voic bla_x()
{
//this function is called when someone io stuff is done
//is actually called from within x_io_lib_loop_forever()
main_io_lib_call_func_in_main(callback_func_main_process);
}
void init_x()
{
//setup things
x_io_lib_loop_forever();
}
void callback_func_main_process()
{
main_io_lib_call_func_in_threadX(func_x);
}
void start_threadX()
{
main_io_lib_register_handler(init_x);
main_io_lib_register_handler(func_x);
main_io_lib_loop_forever();
}
int main()
{
pthread_create(start_thread());
main_io_lib_call_func_in_thread(init_x);
main_io_lib_loop_forever();
}
问题如下:我使用两个不同的事件库(这里称为 main_io 和 x_io)。我使用 main_io 创建一个线程(pthread 包装器),然后在创建的线程中执行
init_x()
。这很好用。然后,创建的线程进行一些初始化,并使用不同的框架执行 io 操作(x_io_lib_loop_forever())
。当创建的线程中的所有内容都设置完毕后, bla_x()
被调用,它调用主进程中的一个函数,而主进程又想要在创建的线程中调用函数(func_x()
)。
这就是出错的地方,因为
x_io_lib_loop_forever()
永远不会返回,func_x()
永远不会在创建的线程中执行。
因此,我正在寻找一种方法来暂停
x_io_lib_loop_forever()
并在该线程中执行 func_x()
。有谁知道如何做到这一点,或者一些更好的设计理念?
所以我决定采取不同的方法,看看是否可以破解一些东西,这意味着在启动的线程中实现部分 main_io 逻辑。准确地说,main_io 使用管道来传递事件。通过从 main_io 获取 fd(读取管道的一部分),并将该 fd 添加到启动线程中的监听部分,我能够收到警报并让事情运行。