【问题标题】:how to access local storage using pthreads如何使用 pthreads 访问本地存储
【发布时间】:2010-12-11 18:13:37
【问题描述】:

我的代码是完全并行的,没有依赖关系,所以使用 pthreads 是一个自然的选择。不幸的是,只有一个共享资源,即日志文件。

在任何情况下,我们都不希望日志逐行交错,因此我不想在每个日志调用上使用互斥锁,而是想为每个线程打开一个单独的日志文件。但是目前,通过代码,有一个全局变量记录器。

我目前有两种解决方案,但都没有让我满意。

  1. 在线程 ID 上实现哈希:pthread_self()。
  2. 将参数从线程创建传递到它调用的每个函数(非常具有侵入性)。

我喜欢一些聪明的方法,让它看起来像我在每个线程中都有一个全局变量,开销很小。

【问题讨论】:

  • 请添加您当前如何使用此变量的代码示例。

标签: c pthreads local-storage


【解决方案1】:

如果每个线程都有自己的日志,请使用 pthread_key_create 和相关函数来维护每个线程的记录器变量。

【讨论】:

    【解决方案2】:

    有一种标准方法可以处理此类每个线程变量:pthread_key_create 和公司。

    如果您对 gcc 及其扩展感到满意,它们具有用于每个线程存储的 __thread 关键字。

    【讨论】:

      【解决方案3】:

      很好的解决方法:不再使用全局变量,让每个线程都有自己的日志记录对象。

      快速修复:将您的记录器全局变量转换为扩展为记录函数调用的宏,并传递线程 ID。或者,使用 pthread 自己的本地到线程存储功能(请参阅 pthread 键)。

      所以,假设你有:

      log(global_fd, char* entry);
      

      您可以避免每次通过以下方式进行修改:

      #define global_fd get_thread_fd()
      

      瞧!

      【讨论】:

      • 这样做可以让您像访问普通变量一样访问logger_fd#define logger_fd (*(int *)pthread_getspecific(logger_key)),但当然它涉及一些额外的间接。
      猜你喜欢
      • 2021-04-05
      • 2012-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-23
      • 2015-06-21
      • 1970-01-01
      • 2021-04-03
      相关资源
      最近更新 更多