【问题标题】:Making a C library thread safe使 C 库线程安全
【发布时间】:2012-08-17 05:24:00
【问题描述】:

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

我的库例程看起来像,

struct lib_handle {
....
};

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

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

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

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

任何帮助都会很棒!

【问题讨论】:

  • 这个库没有使用除 SQLite 之外的任何库。 SQLite 本身是线程安全的。
  • 嘿,+1,终于有一个明智的问题了。

标签: c multithreading concurrency shared-libraries


【解决方案1】:

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

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

【讨论】:

  • 是的。你是对的。其他函数标准库函数呢?
  • @Appu 除非另有说明,否则大多数标准函数都是线程安全的。最好的方法是查看函数的手册页。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    值得我使用你描述的模式很多,并且喜欢它。

    【讨论】:

      猜你喜欢
      • 2021-09-28
      • 2016-06-09
      • 1970-01-01
      • 2016-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-11
      • 1970-01-01
      相关资源
      最近更新 更多