我的代码完全并行,没有依赖关系,所以使用pthreads是一个很自然的选择。不幸的是,有一个共享资源,即日志文件。
我们不希望日志在任何情况下逐行交错,因此我不想在每个日志调用中使用互斥锁,而是为每个线程打开一个单独的日志文件。但是目前,在整个代码中,都有一个全局变量记录器。
我目前有两个解决方案,这两个解决方案都不让我高兴。
我喜欢一些聪明的方法让它看起来像我在每个线程中都有一个全局变量,而且开销非常小。
答案 0 :(得分:4)
如果每个线程都有自己的日志,请使用pthread_key_create和相关函数来维护每线程记录器变量。
答案 1 :(得分:4)
有一种标准方法可以处理这样的每线程变量:pthread_key_create
和公司。
如果您对gcc及其扩展感到满意,则每个线程存储都有__thread
个关键字。
答案 2 :(得分:2)
良好修复:不再使用全局变量,并让每个线程都有自己的日志记录对象。
快速修复:将您的记录器全局变量转换为扩展到日志记录函数调用的宏,并传递线程ID。或者,使用pthreads自己的本地到线程存储功能(请参阅pthread键)。
所以,假设你有:
log(global_fd, char* entry);
您可以通过以下方式避免每次发生修改:
#define global_fd get_thread_fd()
瞧!