6

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

我的图书馆例程看起来像,

struct lib_handle {
....
};

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

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

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

我还没有验证这个假设。我想知道你们对这个设计的看法,你们认为我可以将我的库声明为线程安全的,因为每个线程都有自己的句柄吗?

任何帮助都会很棒!

4

3 回答 3

4

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

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

于 2012-08-17T05:27:57.510 回答
1

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

于 2012-08-17T05:36:04.747 回答
0

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

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

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

于 2012-08-17T08:06:16.323 回答