我必须编写一个线程安全库,它使用 POSIX 信号量(用作初始值 = 1 的互斥锁)进行同步。我发现了一些正确管理异步信号的问题。我有一个链接到这个静态库的应用程序,并且应用程序(多线程)调用库的函数。对某些内部结构的访问由 posix 信号量控制(它在库内部):
void library_func1(lib_handler *h)
{
sem_wait(sem);
/* do some stuff with global data */
sem_post(sem);
}
void library_func2(lib_handler *h)
{
sem_wait(sem);
/* do some stuff with global data */
sem_post(sem);
}
void library_close(lib_handler *h)
{
...
}
SIGINT
如果在一个线程锁定信号量时引发了一个异步信号,比如说 ,会追加什么?如果我重新启动应用程序,我将遇到死锁,因为信号量存在并且它的值是0
. 有一个函数library_close
可以在引发异步信号时释放信号量,但这是最好的检查方法(我认为该函数只有在跟随时才是信号安全的exit
)?在多线程应用程序中,对所有信号使用单个线程管理器通常是一个好习惯:这个线程应该在库中还是可以在应用程序中启动它?
谢谢你们。