如何使用 pthread 访问本地存储

发布于 2024-10-07 03:59:16 字数 316 浏览 10 评论 0原文

我的代码是完全并行的,没有依赖性,因此使用 pthreads 是一个自然的选择。不幸的是,有一种共享资源,即日志文件。

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

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

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

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

I have code that is completely parallel, no dependencies, so using pthreads was a natural choice. Unfortunately, there is one shared resource, the log file.

We don't want the log to be interleaved line-by-line in any case, so rather than use mutexes on every log call I want to open a separate log file for each thread. But currently, all through the code, there is a global variable logger.

I currently have two solutions, neither of which makes me happy.

  1. Implement a hash on the thread id: pthread_self().
  2. Pass the parameter from the thread creation to every function it calls (very invasive).

I'd love some clever way to make it look like I have a global variable in each thread, something with very little overhead.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

青春有你 2024-10-14 03:59:16

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

If each thread gets its own log, use pthread_key_create and related functions to maintain a per-thread logger variable.

小清晰的声音 2024-10-14 03:59:16

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

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

There is a standard way to handle such per-thread variables: pthread_key_create and company.

If you are just happy with gcc and its extensions, they have the __thread keyword for per thread storage.

扛起拖把扫天下 2024-10-14 03:59:16

好的修复:不再使用全局变量,并且让每个线程都有自己的日志记录对象。

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

因此,假设您有:

log(global_fd, char* entry);

您可以避免每次发生这种情况时都必须进行修改:

#define global_fd get_thread_fd()

瞧!

Good fix: don't use the global variable anymore, and have each thread have its own logging object.

Quick fix: transform your logger global variable into a macro that expands into the logging function call, passing the thread ID. Or, use pthreads own local-to-thread storing capabilities (see pthread keys).

So, let's say you have:

log(global_fd, char* entry);

You can avoid having to modify every time that happens via:

#define global_fd get_thread_fd()

And voilà!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文