gpt4 book ai didi

c++ - 支持多线程应用程序回调的 linux 共享库

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

我需要创建一个共享库,它公开一组 API,这些 API 将被多个进程使用,这些进程可能有多个调用 API 的线程。

此共享库又使用另一个我需要注册回调的第 3 方共享库。第 3 方库从不同的线程调用已注册的回调。

我想知道如何在调用我的库中定义的 API 时阻止线程,并在我从第 3 方库获得回调时释放它。此锁定不应阻止其他线程调用相同的 API...!

我正在使用 pthread 库来创建我的库。

伪代码:

我的图书馆:

int lib_init()
{
register_callback(callback);
}

int lib_deinit()
{
unregister_callback();
}

int callback(void *)
{
<unblock the functions>
}

int function1(int, int)
{
perform_action();
<should block till I get a callback from 3rd party library>
}

int function2(char, char)
{
perform_action();
<should block till I get a callback from 3rd party library>
}

第三方库:

int register_callback(callback)
{
....
launch_thread();
....
}

int unregister_callback()
{
....
terminate_thread();
....
}

int perform_action()
{
/* queue action */
}

void* thread(void*arg)
{
/* perform the action & invoke callback */
invoke_callback();
}

应用:

main()
{
init_lib();
....
create_new_thread();
....
function1(10, 20);
....
function2('c', 'd');
}

another_thread()
{
function2('a', 'b');
....
}

我无法解决的确切问题是我需要设置什么(如何)锁定机制来阻止对我的库中定义的函数的调用并等待来自第 3 方库的回调,前提是我的库将被使用在多进程和多线程环境中。

最佳答案

使用普通 pthreads 接口(interface),您将使用条件变量:

int lib_init()
{
pthread_cond_init(&cond, NULL);
pthread_mutex_init(&mutex, NULL);
register_callback(callback);
}

int lib_deinit()
{
unregister_callback();
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&cond);
}

int callback(void *p)
{
pthread_mutex_lock(&mutex);
result[??] = p;
pthread_cond_broadcast(&cond);
pthread_mutex_unlock(&mutex);
}

int function1(int, int)
{
result[??] = NULL;
perform_action();

pthread_mutex_lock(&mutex);
while (result[??] == NULL)
pthread_cond_wait(&cond, &mutex);
pthread_mutex_unlock(&mutex);
}

int function2(char, char)
{
result[??] = NULL;
perform_action();


pthread_mutex_lock(&mutex);
while (result[??] == NULL)
pthread_cond_wait(&cond, &mutex);
pthread_mutex_unlock(&mutex);
}

pthread_cond_wait() 在等待时解锁互斥量。

result[??] 是您必须想出的某种方法的替代品,用于将特定的回调调用链接到特定的 function1() function2() 与其相关的调用。

关于c++ - 支持多线程应用程序回调的 linux 共享库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31045140/

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