我在C中编写一个共享库。我知道C函数不是线程安全的。
我的库例程看起来像,
struct lib_handle {
....
};
int lib_init(lib_handle **handle);
int lib_process(lib_handle *handle);
....
....
每个方法都有一个指向lib_handle
对象的指针。所有状态都存储在此结构中。没有使用全局变量。
我假设如果每个线程创建自己的lib_handle
实例,多个线程可以使用库函数。由于每个线程都有自己的句柄,所以everythibg应该可以工作。
我还没有验证这个假设。我想知道你们对这个设计有什么看法,你能说出我的库是线程安全的,因为每个线程都有它自己的句柄吗?
任何帮助都会很棒!
答案 0 :(得分:4)
这将使库线程的数据/状态安全。
但是你还必须确保你的库使用来自其他库的线程安全函数,例如使用strtok_r
代替strtok
。
答案 1 :(得分:1)
线程在共享内存空间中工作。不安全的对象是多个线程可以同时访问的对象。因此,如果每个线程都有单个lib_handle对象,则不会出现问题。
答案 2 :(得分:0)
如果每个线程都有一个私有的lib_handle对象,那么你的库应该是完全线程安全的;如果你让多个线程共享lib_handle对象,那么使用你的库的人如果正确使用你的库,你仍然可以创建一个线程安全的程序(即你的库本身不是线程不安全的,如果你使用例如全局变量那么它就是这样)。
如果这种操作模式(共享lib_handle)很有意思,你应该清楚地分开只读取lib_handle状态的函数和操作lib_handle状态的函数。前者需要读锁定而后者需要写锁定(调用范围必须处理此问题)。
对于它的价值,我已经使用了你描述的模式,并且喜欢它。