如何使用 pthread 访问本地存储
我的代码是完全并行的,没有依赖性,因此使用 pthreads 是一个自然的选择。不幸的是,有一种共享资源,即日志文件。
在任何情况下,我们都不希望日志逐行交错,因此我不想在每个日志调用上使用互斥体,而是想为每个线程打开一个单独的日志文件。但目前,整个代码中都有一个全局变量记录器。
我目前有两种解决方案,但都不让我满意。
- 在线程 id 上实现哈希:pthread_self()。
- 将参数从线程创建传递到它调用的每个函数(非常侵入性)。
我喜欢一些聪明的方法,让它看起来像我在每个线程中有一个全局变量,开销很小。
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.
- Implement a hash on the thread id: pthread_self().
- 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
如果每个线程都有自己的日志,请使用 pthread_key_create 和相关函数来维护每个线程记录器变量。
If each thread gets its own log, use pthread_key_create and related functions to maintain a per-thread logger variable.
有一种标准方法可以处理此类每线程变量: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.好的修复:不再使用全局变量,并且让每个线程都有自己的日志记录对象。
快速修复:将记录器全局变量转换为宏,该宏扩展为日志记录函数调用,并传递线程 ID。或者,使用 pthread 自己的本地线程存储功能(请参阅 pthread 键)。
因此,假设您有:
您可以避免每次发生这种情况时都必须进行修改:
瞧!
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:
You can avoid having to modify every time that happens via:
And voilà!