2012-08-17 50 views
5

我正在用C写一个共享库。我知道C函数不是线程安全的。制作C库线程安全

我的库函数的样子,

struct lib_handle { 
.... 
}; 

int lib_init(lib_handle **handle); 
int lib_process(lib_handle *handle); 
.... 
.... 

每个方法都需要一个指针lib_handle对象。所有的状态都存储在这个结构中。没有使用全局变量。

我假设每个线程创建它自己的lib_handle实例,多个线程可以使用库函数。由于每个线程都有自己的句柄,所以everythibg应该可以工作。

我还没有验证这个假设。我想知道你们对这个设计有什么想法,并且为了让每个线程都有它自己的控制柄,我可以说我的库是线程安全的吗?

任何帮助将是伟大的!

+0

此库不使用SQLite以外的任何库。 SQLite本身是线程安全的。 – 2012-08-17 05:26:14

+0

嘿,+1,最后一个明智的问题。 – 2012-08-17 05:49:36

回答

3

这将使数据库/线程库的状态安全。

但您还必须确保您的库使用其他库中的线程安全函数,例如,使用strtok_r而不是strtok

+0

是的。你是对的。其他函数标准库函数呢? – 2012-08-17 05:38:56

+0

@Appu除非另有说明,否则大部分标准函数都是线程安全的。最好的方法是查看功能的man page。 – Rohan 2012-08-17 06:24:07

1

线程在共享内存空间中工作。不安全的对象是可以被多个线程模拟地访问的对象。因此,如果每个线程都有单个lib_handle对象,则不会有任何问题。

0

如果每个线程都有一个私有lib_handle对象,则该库应该完全线程安全;如果你让多个线程共享lib_handle对象,那么使用你的库的人仍然可以创建一个线程安全的程序,如果她正确使用你的库(即你的库本质上不是线程不安全的,如果你使用了全局变量)。

如果这种操作模式(共享lib_handle)很有意思,那么应该清楚地区分只读取lib_handle状态和操作lib_handle状态的函数。前者需要读锁,后者需要写锁(调用范围必须处理该锁)。

为了什么是值得我用过的模式,你描述了很多,并喜欢它。