0

我必须编写一个线程安全库,它使用 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)?在多线程应用程序中,对所有信号使用单个线程管理器通常是一个好习惯:这个线程应该在库中还是可以在应用程序中启动它?

谢谢你们。

4

2 回答 2

0

Linux futex 也有同样的问题。它不是完全可解决的,但您可以做的是编写进程的 pid,将信号量锁定在同一共享内存区域的某处。如果另一个进程试图锁定信号量并且花费的时间太长(对于某些“太长”值),它会通过从共享内存中读取 pid 来找出哪个进程锁定了信号量。如果该进程不再存在,您就知道您处于死锁状态(您可能应该死掉,因为库的内部数据可能处于不一致的状态)。

这仍然存在一个小竞赛,因为获取锁的进程可能会在锁定之后但在写入其 pid 之前死亡。AFAIK 没有办法使用信号量来避免这种情况。(如果您有一个锁实现,其中 pid 在获取时以原子方式写入锁变量,它可能会起作用,但您可能需要自己编写。)

于 2013-01-12T14:28:35.283 回答
-1

静态库的状态不会在应用程序的不同运行之间转移,也不会被使用它的其他应用程序共享。它是使用它的应用程序状态的一部分。所以你的信号量不会处于不稳定状态。

于 2012-09-05T20:25:46.647 回答