使C库线程安全

时间:2012-08-17 05:24:00

标签: c multithreading concurrency shared-libraries

我在C中编写一个共享库。我知道C函数不是线程安全的。

我的库例程看起来像,

struct lib_handle {
....
};

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

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

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

我还没有验证这个假设。我想知道你们对这个设计有什么看法,你能说出我的库是线程安全的,因为每个线程都有它自己的句柄吗?

任何帮助都会很棒!

3 个答案:

答案 0 :(得分:4)

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

但是你还必须确保你的库使用来自其他库的线程安全函数,例如使用strtok_r代替strtok

答案 1 :(得分:1)

线程在共享内存空间中工作。不安全的对象是多个线程可以同时访问的对象。因此,如果每个线程都有单个lib_handle对象,则不会出现问题。

答案 2 :(得分:0)

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

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

对于它的价值,我已经使用了你描述的模式,并且喜欢它。